* @param rad radius
* @param p L_p value
* @return path element
*/
public static <V extends NumberVector<V, ?>, D extends NumberDistance<?, ?>> Element drawLp(SVGPlot svgp, Projection2D proj, V mid, D rad, double p) {
Vector v_mid = mid.getColumnVector();
BitSet dims = proj.getVisibleDimensions2D();
final double kappax, kappay;
if(p > 1.) {
double kappal = Math.pow(0.5, 1. / p);
kappax = Math.min(1.3, 4. * (2 * kappal - 1) / 3.);
kappay = 0;
}
else if(p < 1.) {
double kappal = 1 - Math.pow(0.5, 1. / p);
kappax = 0;
kappay = Math.min(1.3, 4. * (2 * kappal - 1) / 3.);
}
else {
kappax = 0;
kappay = 0;
}
// LoggingUtil.warning("kappax: " + kappax + " kappay: " + kappay);
SVGPath path = new SVGPath();
for(int dim = dims.nextSetBit(0); dim >= 0; dim = dims.nextSetBit(dim + 1)) {
Vector vp0 = v_mid.copy();
vp0.set(dim, vp0.get(dim) + rad.doubleValue());
Vector vm0 = v_mid.copy();
vm0.set(dim, vm0.get(dim) - rad.doubleValue());
double[] pvp0 = proj.fastProjectDataToRenderSpace(vp0);
double[] pvm0 = proj.fastProjectDataToRenderSpace(vm0);
// delta vector
Vector tvd0 = new Vector(vp0.getDimensionality());
tvd0.set(dim, rad.doubleValue());
double[] vd0 = proj.fastProjectRelativeDataToRenderSpace(tvd0);
for(int dim2 = dims.nextSetBit(0); dim2 >= 0; dim2 = dims.nextSetBit(dim2 + 1)) {
if(dim < dim2) {
Vector v0p = v_mid.copy();
v0p.set(dim2, v0p.get(dim2) + rad.doubleValue());
Vector v0m = v_mid.copy();
v0m.set(dim2, v0m.get(dim2) - rad.doubleValue());
double[] pv0p = proj.fastProjectDataToRenderSpace(v0p);
double[] pv0m = proj.fastProjectDataToRenderSpace(v0m);
// delta vector
Vector tv0d = new Vector(vm0.getDimensionality());
tv0d.set(dim2, rad.doubleValue());
double[] v0d = proj.fastProjectRelativeDataToRenderSpace(tv0d);
if(p > 1) {
// p > 1
path.moveTo(pvp0[0], pvp0[1]);