|
@@ -155,6 +155,61 @@ final public class FastMath {
|
|
return interpolateLinear(scale, startValue, endValue, null);
|
|
return interpolateLinear(scale, startValue, endValue, null);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Linear extrapolation from startValue to endValue by the given scale.
|
|
|
|
+ * if scale is between 0 and 1 this method returns the same result as interpolateLinear
|
|
|
|
+ * if the scale is over 1 the value is linearly extrapolated.
|
|
|
|
+ * Note that the end value is the value for a scale of 1.
|
|
|
|
+ * @param scale the scale for extrapolation
|
|
|
|
+ * @param startValue the starting value (scale = 0)
|
|
|
|
+ * @param endValue the end value (scale = 1)
|
|
|
|
+ * @return an extrapolation for the given parameters
|
|
|
|
+ */
|
|
|
|
+ public static float extrapolateLinear(float scale, float startValue, float endValue) {
|
|
|
|
+ if (scale <= 0f) {
|
|
|
|
+ return startValue;
|
|
|
|
+ }
|
|
|
|
+ return ((1f - scale) * startValue) + (scale * endValue);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Linear extrapolation from startValue to endValue by the given scale.
|
|
|
|
+ * if scale is between 0 and 1 this method returns the same result as interpolateLinear
|
|
|
|
+ * if the scale is over 1 the value is linearly extrapolated.
|
|
|
|
+ * Note that the end value is the value for a scale of 1.
|
|
|
|
+ * @param scale the scale for extrapolation
|
|
|
|
+ * @param startValue the starting value (scale = 0)
|
|
|
|
+ * @param endValue the end value (scale = 1)
|
|
|
|
+ * @param store an initialized vector to store the return value
|
|
|
|
+ * @return an extrapolation for the given parameters
|
|
|
|
+ */
|
|
|
|
+ public static Vector3f extrapolateLinear(float scale, Vector3f startValue, Vector3f endValue, Vector3f store) {
|
|
|
|
+ if (store == null) {
|
|
|
|
+ store = new Vector3f();
|
|
|
|
+ }
|
|
|
|
+ if (scale <= 1f) {
|
|
|
|
+ return interpolateLinear(scale, startValue, endValue, store);
|
|
|
|
+ }
|
|
|
|
+ store.x = extrapolateLinear(scale, startValue.x, endValue.x);
|
|
|
|
+ store.y = extrapolateLinear(scale, startValue.y, endValue.y);
|
|
|
|
+ store.z = extrapolateLinear(scale, startValue.z, endValue.z);
|
|
|
|
+ return store;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Linear extrapolation from startValue to endValue by the given scale.
|
|
|
|
+ * if scale is between 0 and 1 this method returns the same result as interpolateLinear
|
|
|
|
+ * if the scale is over 1 the value is linearly extrapolated.
|
|
|
|
+ * Note that the end value is the value for a scale of 1.
|
|
|
|
+ * @param scale the scale for extrapolation
|
|
|
|
+ * @param startValue the starting value (scale = 0)
|
|
|
|
+ * @param endValue the end value (scale = 1)
|
|
|
|
+ * @return an extrapolation for the given parameters
|
|
|
|
+ */
|
|
|
|
+ public static Vector3f extrapolateLinear(float scale, Vector3f startValue, Vector3f endValue) {
|
|
|
|
+ return extrapolateLinear(scale, startValue, endValue, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**Interpolate a spline between at least 4 control points following the Catmull-Rom equation.
|
|
/**Interpolate a spline between at least 4 control points following the Catmull-Rom equation.
|
|
* here is the interpolation matrix
|
|
* here is the interpolation matrix
|
|
* m = [ 0.0 1.0 0.0 0.0 ]
|
|
* m = [ 0.0 1.0 0.0 0.0 ]
|
|
@@ -244,13 +299,13 @@ final public class FastMath {
|
|
* @return Bezier interpolation
|
|
* @return Bezier interpolation
|
|
*/
|
|
*/
|
|
public static float interpolateBezier(float u, float p0, float p1, float p2, float p3) {
|
|
public static float interpolateBezier(float u, float p0, float p1, float p2, float p3) {
|
|
- float oneMinusU = 1.0f - u;
|
|
|
|
- float oneMinusU2 = oneMinusU * oneMinusU;
|
|
|
|
- float u2 = u * u;
|
|
|
|
- return p0 * oneMinusU2 * oneMinusU +
|
|
|
|
- 3.0f * p1 * u * oneMinusU2 +
|
|
|
|
- 3.0f * p2 * u2 * oneMinusU +
|
|
|
|
- p3 * u2 * u;
|
|
|
|
|
|
+ float oneMinusU = 1.0f - u;
|
|
|
|
+ float oneMinusU2 = oneMinusU * oneMinusU;
|
|
|
|
+ float u2 = u * u;
|
|
|
|
+ return p0 * oneMinusU2 * oneMinusU
|
|
|
|
+ + 3.0f * p1 * u * oneMinusU2
|
|
|
|
+ + 3.0f * p2 * u2 * oneMinusU
|
|
|
|
+ + p3 * u2 * u;
|
|
}
|
|
}
|
|
|
|
|
|
/**Interpolate a spline between at least 4 control points following the Bezier equation.
|
|
/**Interpolate a spline between at least 4 control points following the Bezier equation.
|
|
@@ -297,7 +352,7 @@ final public class FastMath {
|
|
public static Vector3f interpolateBezier(float u, Vector3f p0, Vector3f p1, Vector3f p2, Vector3f p3) {
|
|
public static Vector3f interpolateBezier(float u, Vector3f p0, Vector3f p1, Vector3f p2, Vector3f p3) {
|
|
return interpolateBezier(u, p0, p1, p2, p3, null);
|
|
return interpolateBezier(u, p0, p1, p2, p3, null);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Compute the lenght on a catmull rom spline between control point 1 and 2
|
|
* Compute the lenght on a catmull rom spline between control point 1 and 2
|
|
* @param p0 control point 0
|
|
* @param p0 control point 0
|
|
@@ -345,11 +400,11 @@ final public class FastMath {
|
|
public static float getBezierP1toP2Length(Vector3f p0, Vector3f p1, Vector3f p2, Vector3f p3) {
|
|
public static float getBezierP1toP2Length(Vector3f p0, Vector3f p1, Vector3f p2, Vector3f p3) {
|
|
float delta = 0.02f, t = 0.0f, result = 0.0f;
|
|
float delta = 0.02f, t = 0.0f, result = 0.0f;
|
|
Vector3f v1 = p0.clone(), v2 = new Vector3f();
|
|
Vector3f v1 = p0.clone(), v2 = new Vector3f();
|
|
- while(t<=1.0f) {
|
|
|
|
- FastMath.interpolateBezier(t, p0, p1, p2, p3, v2);
|
|
|
|
- result += v1.subtractLocal(v2).length();
|
|
|
|
- v1.set(v2);
|
|
|
|
- t += delta;
|
|
|
|
|
|
+ while (t <= 1.0f) {
|
|
|
|
+ FastMath.interpolateBezier(t, p0, p1, p2, p3, v2);
|
|
|
|
+ result += v1.subtractLocal(v2).length();
|
|
|
|
+ v1.set(v2);
|
|
|
|
+ t += delta;
|
|
}
|
|
}
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
@@ -684,7 +739,7 @@ final public class FastMath {
|
|
}
|
|
}
|
|
return val3;
|
|
return val3;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* A method that computes normal for a triangle defined by three vertices.
|
|
* A method that computes normal for a triangle defined by three vertices.
|
|
* @param v1 first vertex
|
|
* @param v1 first vertex
|
|
@@ -693,9 +748,9 @@ final public class FastMath {
|
|
* @return a normal for the face
|
|
* @return a normal for the face
|
|
*/
|
|
*/
|
|
public static Vector3f computeNormal(Vector3f v1, Vector3f v2, Vector3f v3) {
|
|
public static Vector3f computeNormal(Vector3f v1, Vector3f v2, Vector3f v3) {
|
|
- Vector3f a1 = v1.subtract(v2);
|
|
|
|
- Vector3f a2 = v3.subtract(v2);
|
|
|
|
- return a2.crossLocal(a1).normalizeLocal();
|
|
|
|
|
|
+ Vector3f a1 = v1.subtract(v2);
|
|
|
|
+ Vector3f a2 = v3.subtract(v2);
|
|
|
|
+ return a2.crossLocal(a1).normalizeLocal();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|