A class that models a Cubic-Bezier curve
//package graphicsEngine.math;
import java.io.Serializable;
import javax.vecmath.Vector3d;
/**
* a class that models a Cubic-Bezier curve
* @author Adam Levi, Marina Skarbovsky
*/
public class CubicBezierCurve implements Serializable
{
private static final long serialVersionUID = -5219859720055898005L;
private Vector3d[] P;
/**
* a contructor
* @param pointsVector 4 points that are required to build the bezier curve
*/
public CubicBezierCurve(Vector3d[] pointsVector)
{
this.P = pointsVector;
}
/**
* returns the point in 3d space that corresponds to the given value of t
* @param t curve's parameter that should be in the range [0, 1.0]
* @return the point in 3d space that corresponds to the given value of t
*/
public Vector3d getValue(double t)
{
if (t > 1.0 || t < 0.0)
{
throw new IllegalArgumentException("The value of t is out of range: " + t + " .");
}
double one_minus_t = 1 - t;
Vector3d retValue = new Vector3d();
Vector3d[] terms = new Vector3d[4];
terms[0] = calcNewVector(one_minus_t * one_minus_t * one_minus_t, P[0]);
terms[1] = calcNewVector(3 * one_minus_t * one_minus_t * t, P[1]);
terms[2] = calcNewVector(3 * one_minus_t * t * t, P[2]);
terms[3] = calcNewVector(t * t * t, P[3]);
for (int i = 0 ; i < 4; i++)
{
retValue.add(terms[i]);
}
return retValue;
}
/**
* calculates and returns a new vector that is base * scaler
* @param scaler
* @param base
* @return
*/
private Vector3d calcNewVector(double scaler, Vector3d base)
{
Vector3d retValue = new Vector3d(base);
retValue.scale(scaler);
return retValue;
}
}
Related examples in the same category