docs: public static Element drawLp(SVGPlot svgp, Projection2D proj, NumberVector mid, double radius, double p) {
      final double[] v_mid = mid.toArray();
      final long[] dims = proj.getVisibleDimensions2D();
  
      double kappax = p > 1 ? Math.min(1.3, 4. * (2 * FastMath.pow(0.5, 1. / p) - 1) / 3.) : 0;
      double kappay = p < 1 ? Math.min(1.3, 4. * (2 * (1 - FastMath.pow(0.5, 1. / p)) - 1) / 3.) : 0;
  
      SVGPath path = new SVGPath();
      for(int dim = BitsUtil.nextSetBit(dims, 0); dim >= 0; dim = BitsUtil.nextSetBit(dims, dim + 1)) {
        v_mid[dim] += radius;
        double[] pvp0 = proj.fastProjectDataToRenderSpace(v_mid);
        v_mid[dim] -= radius * 2;
        double[] pvm0 = proj.fastProjectDataToRenderSpace(v_mid);
        v_mid[dim] += radius;
        // delta vector
        double[] tvd0 = new double[v_mid.length];
        tvd0[dim] = radius;
        double[] vd0 = proj.fastProjectRelativeDataToRenderSpace(tvd0);
        for(int dim2 = BitsUtil.nextSetBit(dims, 0); dim2 >= 0; dim2 = BitsUtil.nextSetBit(dims, dim2 + 1)) {
          if(dim < dim2) {
            v_mid[dim2] += radius;
            double[] pv0p = proj.fastProjectDataToRenderSpace(v_mid);
            v_mid[dim2] -= radius * 2;
            double[] pv0m = proj.fastProjectDataToRenderSpace(v_mid);
            v_mid[dim2] += radius;
            // delta vector
            double[] tv0d = new double[v_mid.length];
            tv0d[dim2] = radius;
            double[] v0d = proj.fastProjectRelativeDataToRenderSpace(tv0d);
  
            if(p > 1) {
              // p > 1
              // support points, p0 to 0p
              final double s_pp1_x = pvp0[0] + v0d[0] * kappax;
              final double s_pp1_y = pvp0[1] + v0d[1] * kappax;
              final double s_pp2_x = pv0p[0] + vd0[0] * kappax;
              final double s_pp2_y = pv0p[1] + vd0[1] * kappax;
              // support points, 0p to m0
              final double s_mp1_x = pv0p[0] - vd0[0] * kappax;
              final double s_mp1_y = pv0p[1] - vd0[1] * kappax;
              final double s_mp2_x = pvm0[0] + v0d[0] * kappax;
              final double s_mp2_y = pvm0[1] + v0d[1] * kappax;
              // support points, m0 to 0m
              final double s_mm1_x = pvm0[0] - v0d[0] * kappax;
              final double s_mm1_y = pvm0[1] - v0d[1] * kappax;
              final double s_mm2_x = pv0m[0] - vd0[0] * kappax;
              final double s_mm2_y = pv0m[1] - vd0[1] * kappax;
              // support points, 0m to p0
              final double s_pm1_x = pv0m[0] + vd0[0] * kappax;
              final double s_pm1_y = pv0m[1] + vd0[1] * kappax;
              final double s_pm2_x = pvp0[0] - v0d[0] * kappax;
              final double s_pm2_y = pvp0[1] - v0d[1] * kappax;
              path.moveTo(pvp0[0], pvp0[1]) //
                  .cubicTo(s_pp1_x, s_pp1_y, s_pp2_x, s_pp2_y, pv0p[0], pv0p[1]) //
                  .cubicTo(s_mp1_x, s_mp1_y, s_mp2_x, s_mp2_y, pvm0[0], pvm0[1]) //
                  .cubicTo(s_mm1_x, s_mm1_y, s_mm2_x, s_mm2_y, pv0m[0], pv0m[1]) //
                  .cubicTo(s_pm1_x, s_pm1_y, s_pm2_x, s_pm2_y, pvp0[0], pvp0[1]) //
                  .close();
            }
            else if(p < 1) {
              // p < 1
              // support points, p0 to 0p
              final double s_vp0_x = pvp0[0] - vd0[0] * kappay;
              final double s_vp0_y = pvp0[1] - vd0[1] * kappay;
              final double s_v0p_x = pv0p[0] - v0d[0] * kappay;
              final double s_v0p_y = pv0p[1] - v0d[1] * kappay;
              final double s_vm0_x = pvm0[0] + vd0[0] * kappay;
              final double s_vm0_y = pvm0[1] + vd0[1] * kappay;
              final double s_v0m_x = pv0m[0] + v0d[0] * kappay;
              final double s_v0m_y = pv0m[1] + v0d[1] * kappay;
              // Draw the star
              path.moveTo(pvp0[0], pvp0[1]) //
                  .cubicTo(s_vp0_x, s_vp0_y, s_v0p_x, s_v0p_y, pv0p[0], pv0p[1]) //
                  .cubicTo(s_v0p_x, s_v0p_y, s_vm0_x, s_vm0_y, pvm0[0], pvm0[1]) //
                  .cubicTo(s_vm0_x, s_vm0_y, s_v0m_x, s_v0m_y, pv0m[0], pv0m[1]) //
                  .cubicTo(s_v0m_x, s_v0m_y, s_vp0_x, s_vp0_y, pvp0[0], pvp0[1]) //
                  .close();
            }
            else {
              // p == 1 - Manhattan
              path.moveTo(pvp0[0], pvp0[1]) //
                  .lineTo(pv0p[0], pv0p[1]) //
                  .lineTo(pvm0[0], pvm0[1]) //
                  .lineTo(pv0m[0], pv0m[1]) //
                  .lineTo(pvp0[0], pvp0[1]) //
                  .close();
            }
          }
        }
      }
      return path.makeElement(svgp);
    }