if(selfLoop) {
if(cubic == null)
cubic = new CubicCurve2D.Double();
Vector2D corde = direction.copy();
corde.stretch(1.7);
if(corde.length()<100)
corde.setLength(100);
corde.rotate(-40);
cubic.ctrlx1 = getStartWithOffset().getX()+corde.getX();
cubic.ctrly1 = getStartWithOffset().getY()+corde.getY();
corde.rotate(+80);
cubic.ctrlx2 = getStartWithOffset().getX()+corde.getX();
cubic.ctrly2 = getStartWithOffset().getY()+corde.getY();
// Move the start/end point according to offset
Vector2D v1 = new Vector2D(cubic.ctrlx1, cubic.ctrly1).sub(getStartWithOffset());
Vector2D v2 = new Vector2D(cubic.ctrlx2, cubic.ctrly2).sub(getStartWithOffset());
v1 = v1.normalize();
v1.stretch(startTangentOffset);
v2 = v2.normalize();
v2.stretch(endTangentOffset);
cubic.x1 = getStartWithOffset().getX()+v1.getX();
cubic.y1 = getStartWithOffset().getY()+v1.getY();
cubic.x2 = getEndWithOffset().getX()+v2.getX();
cubic.y2 = getEndWithOffset().getY()+v2.getY();
// Position of the label
Vector2D vlabel = direction.copy();
vlabel.setLength(vlabel.length()+15);
if(vlabel.length()<75)
vlabel.setLength(75);
Vector2D plabel = getStartWithOffset().add(vlabel);
label.setPosition(plabel);
// Create the arrow at the end of the path
arrow.setAnchor(cubic.x2, cubic.y2);
arrow.setDirection(new Vector2D(cubic.ctrlx2-cubic.x2, cubic.ctrly2-cubic.y2));
shape = cubic;
} else {
Vector2D middle = getEndWithOffset().sub(getStartWithOffset());
middle.stretch(0.5);
Vector2D height = middle.normalize();
height.rotate(-90);
if(flateness == 0)
height.setLength(0.01);
else
height.setLength(flateness);
Vector2D ctrl = middle.add(height);
if(quad == null)
quad = new QuadCurve2D.Double();
quad.x1 = getStartWithOffset().getX();
quad.y1 = getStartWithOffset().getY();
quad.x2 = getEndWithOffset().getX();
quad.y2 = getEndWithOffset().getY();
quad.ctrlx = getStartWithOffset().getX()+ctrl.getX();
quad.ctrly = getStartWithOffset().getY()+ctrl.getY();
Vector2D controlPoint = new Vector2D(quad.ctrlx, quad.ctrly);
// Move the start/end point according to offset
Vector2D v1 = controlPoint.sub(getStartWithOffset());
Vector2D v2 = controlPoint.sub(getEndWithOffset());
v1 = v1.normalize();
v1.stretch(startTangentOffset);
v2 = v2.normalize();
v2.stretch(endTangentOffset);
quad.x1 = getStartWithOffset().getX()+v1.getX();
quad.y1 = getStartWithOffset().getY()+v1.getY();
quad.x2 = getEndWithOffset().getX()+v2.getX();
quad.y2 = getEndWithOffset().getY()+v2.getY();
// Position of the label
pmiddle = new Vector2D(quad.x1+(quad.x2-quad.x1)*0.5, quad.y1+(quad.y2-quad.y1)*0.5);
vlabel = new Vector2D(quad.x2-quad.x1, quad.y2-quad.y1).rotate(90*(flateness<0?1:-1));
vlabel.setLength(Math.abs(flateness)*0.5+20);
label.setPosition(pmiddle.add(vlabel));
// Create the arrow at the end of the path