Calculation of Bezier curve's length added.
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7064 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
ff5db41a0e
commit
7aae9615ca
@ -334,6 +334,39 @@ final public class FastMath {
|
|||||||
return l;
|
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>
|
* Returns the arc cosine of an angle given in radians.<br>
|
||||||
|
@ -156,6 +156,8 @@ public class Spline implements Savable {
|
|||||||
totalLength += l;
|
totalLength += l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if(type == SplineType.Bezier) {
|
||||||
|
this.computeBezierLength();
|
||||||
} else {
|
} else {
|
||||||
initCatmullRomWayPoints(controlPoints);
|
initCatmullRomWayPoints(controlPoints);
|
||||||
computeCatmulLength();
|
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
|
* Iterpolate a position on the spline
|
||||||
|
Loading…
x
Reference in New Issue
Block a user