From 7aae9615ca6a2ebdb78d7098dfcb736c7c841929 Mon Sep 17 00:00:00 2001 From: "Kae..pl" Date: Mon, 21 Mar 2011 13:07:55 +0000 Subject: [PATCH] Calculation of Bezier curve's length added. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7064 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/src/core/com/jme3/math/FastMath.java | 33 +++++++++++++++++++++ engine/src/core/com/jme3/math/Spline.java | 17 +++++++++++ 2 files changed, 50 insertions(+) diff --git a/engine/src/core/com/jme3/math/FastMath.java b/engine/src/core/com/jme3/math/FastMath.java index b0b3b4887..040fd4cd5 100644 --- a/engine/src/core/com/jme3/math/FastMath.java +++ b/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.
diff --git a/engine/src/core/com/jme3/math/Spline.java b/engine/src/core/com/jme3/math/Spline.java index 8ed8ad952..8d23d6fe9 100644 --- a/engine/src/core/com/jme3/math/Spline.java +++ b/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