+
+ private static void updateVariableLength(PipeControlPoint icp, PipeControlPoint prev, PipeControlPoint next) {
+ Vector3d prevPos = prev.getWorldPosition();
+ Vector3d nextPos = next.getWorldPosition();
+
+ Vector3d dir = new Vector3d(nextPos);
+ dir.sub(prevPos);
+ double l = dir.lengthSquared(); // distance between
+ // control points
+ // (square)
+ double l2prev = prev.getInlineLength(); // distance
+ // taken
+ // by
+ // components
+ double l2next = next.getInlineLength();
+ double l2 = l2prev + l2next;
+ double l2s = MathTools.square(l2);
+ if (l2s < l) { // check if there is enough space for
+ // variable length component.
+ // components fit
+ dir.normalize();
+ double length = Math.sqrt(l) - l2; // true length of
+ // the variable
+ // length
+ // component
+ dir.scale(length * 0.5 + l2prev); // calculate
+ // center
+ // position of
+ // the component
+ dir.add(prevPos);
+ icp.setWorldPosition(dir);
+ icp.setLength(length);
+ } else {
+ // components leave no space to the component and it
+ // must be removed
+ if (icp.isDeletable())
+ icp._remove();
+ }
+ }
+
+ private static void updateVariableLengthEnd(PipeControlPoint icp, PipeControlPoint prev) {
+ double currentLength = icp.getLength();
+ Vector3d currentPos = icp.getWorldPosition();
+ Vector3d prevPos = prev.getWorldPosition();
+
+ Vector3d dir = new Vector3d();
+ dir.sub(currentPos, prevPos);
+
+ if (currentLength < MathTools.NEAR_ZERO) {
+ currentLength = (dir.length() - prev.getInlineLength()) * 2.0;
+ }
+
+ if (dir.lengthSquared() > MathTools.NEAR_ZERO)
+ dir.normalize();
+ Point3d endPos = new Point3d(dir);
+ endPos.scale(currentLength * 0.5);
+ endPos.add(currentPos); // this is the free end of the
+ // component
+
+ double offset = prev.getInlineLength();
+ Point3d beginPos = new Point3d(dir);
+ beginPos.scale(offset);
+ beginPos.add(prevPos); // this is the connected end of
+ // the component
+
+ double l = beginPos.distance(endPos);
+
+ if (Double.isNaN(l))
+ System.out.println();
+
+ dir.scale(l * 0.5);
+ beginPos.add(dir); // center position
+
+ if (DEBUG)
+ System.out.println("PipingRules.updateInlineControlPoints() setting variable length to " + l);
+ icp.setLength(l);
+
+ icp.setWorldPosition(new Vector3d(beginPos));
+ }