public boolean isInline() {
return type == PointType.INLINE;
}
+
+ public boolean asPathLegEnd() {
+ // Ends and Turns are path leg ends by default, but also unconnected inline are path leg ends.
+ return isPathLegEnd() || getNext() == null || getPrevious() == null;
+ }
/**
* True for end components, if control point defines absolute position direction, which rules cannot modify.
if (MathTools.createRotation(dirOutN, dirOut, dir, aa)) {
setRotationAngle(aa.angle);
setTurnAngle(angle);
+ if (DEBUG) System.out.println("convertToFixed " + dir + " " + dirOut + " " +dirOutN + " " +angle + " "+ aa.angle);
}
}
return getControlPointOrientationQuat(dir, turnAxis, angle);
}
}
+
+ public Quat4d getControlPointOrientationQuat(Vector3d dir, double angle, boolean reversed) {
+ if (turnAxis == null) {
+ if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+ dir.normalize();
+ Quat4d q = getControlPointOrientationQuat(dir, angle);
+ if (reversed) {
+ Quat4d q2 = new Quat4d();
+ q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
+ q.mulInverse(q2);
+ }
+ return q;
+ } else {
+ if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+ dir.normalize();
+ return getControlPointOrientationQuat(dir, turnAxis, angle);
+ }
+ }
public Quat4d getControlPointOrientationQuat(double angle, boolean reversed) {
if (turnAxis == null) {
Vector3d dir = getPathLegDirection(Direction.NEXT);
- if (dir.lengthSquared() > MathTools.NEAR_ZERO)
- dir.normalize();
- Quat4d q = getControlPointOrientationQuat(dir, angle);
- if (reversed) {
- Quat4d q2 = new Quat4d();
- q2.set(new AxisAngle4d(MathTools.Y_AXIS, Math.PI));
- q.mulInverse(q2);
- }
- return q;
+ return getControlPointOrientationQuat(dir, angle, reversed);
} else {
Vector3d dir = getPathLegDirection(Direction.PREVIOUS);
dir.negate();
- if (dir.lengthSquared() > MathTools.NEAR_ZERO)
- dir.normalize();
- return getControlPointOrientationQuat(dir, turnAxis, angle);
+ return getControlPointOrientationQuat(dir, angle, reversed);
}
}
} else if (currentNext != null) {
if (currentNext.isDualInline()) {
PipeControlPoint sccp = currentNext;
- PipeControlPoint ocp = getDualSub();
+ PipeControlPoint ocp = currentNext.getDualSub();
if (ocp == null) {
throw new RuntimeException("Removing PipeControlPoint " + this+ " structure damaged, no offset control point");
}