Procházet zdrojové kódy

Calculation of Bezier curve's length added.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7064 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
Kae..pl před 14 roky
rodič
revize
7aae9615ca

+ 33 - 0
engine/src/core/com/jme3/math/FastMath.java

@@ -334,6 +334,39 @@ final public class FastMath {
         return l;
     }
 
+    /**
+     * Compute the length on a Bezier spline between control point 1 and 2.
+     * @param p0 control point 0
+     * @param p1 control point 1
+     * @param p2 control point 2
+     * @param p3 control point 3
+     * @param startRange the starting range on the segment (use 0)
+     * @param endRange the end range on the segment (use 1)
+     * @return the length of the segment
+     */
+    public static float getBezierP1toP2Length(Vector3f p0, Vector3f p1, Vector3f p2, Vector3f p3, float startRange, float endRange) {
+        float epsilon = 0.001f;
+        float middleValue = (startRange + endRange) * 0.5f;
+        Vector3f start = p1.clone();
+        if (startRange != 0) {
+        	FastMath.interpolateBezier(startRange, p0, p1, p2, p3, start);
+        }
+        Vector3f end = p2.clone();
+        if (endRange != 1) {
+        	FastMath.interpolateBezier(endRange, p0, p1, p2, p3, end);
+        }
+        Vector3f middle = FastMath.interpolateBezier(middleValue, p0, p1, p2, p3);
+        float l = end.subtract(start).length();
+        float l1 = middle.subtract(start).length();
+        float l2 = end.subtract(middle).length();
+        float len = l1 + l2;
+        if (l + epsilon < len) {
+            l1 = FastMath.getBezierP1toP2Length(p0, p1, p2, p3, startRange, middleValue);
+            l2 = FastMath.getBezierP1toP2Length(p0, p1, p2, p3, middleValue, endRange);
+        }
+        l = l1 + l2;
+        return l;
+    }
 
     /**
      * Returns the arc cosine of an angle given in radians.<br>

+ 17 - 0
engine/src/core/com/jme3/math/Spline.java

@@ -156,6 +156,8 @@ public class Spline implements Savable {
                     totalLength += l;
                 }
             }
+        } else if(type == SplineType.Bezier) { 
+        	this.computeBezierLength();
         } else {
             initCatmullRomWayPoints(controlPoints);
             computeCatmulLength();
@@ -173,6 +175,21 @@ public class Spline implements Savable {
             }
         }
     }
+    
+    /**
+     * This method calculates the Bezier curve length.
+     */
+    private void computeBezierLength() {
+    	float l = 0;
+        if (controlPoints.size() > 1) {
+            for (int i = 0; i < controlPoints.size() - 1; i+=3) {
+                l = FastMath.getBezierP1toP2Length(controlPoints.get(i),
+                		controlPoints.get(i + 1), controlPoints.get(i + 2), controlPoints.get(i + 3), 0, 1);
+                segmentsLength.add(l);
+                totalLength += l;
+            }
+        }
+    }
 
     /**
      * Iterpolate a position on the spline