package curves;
import java.util.ArrayList;
/**
* Calculate the Bezier curve for a 2-dimensional object using the solution to the matrix equation.
* @author asevans
*
*/
public class Bezier {
private int order=4;
private ArrayList<PointObject> controlObjects;
/**
* Empty Constructor
*/
public Bezier() {
}
/**
* Set the order (nth power +1)
* @return
*/
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public ArrayList<PointObject> getControlObjects() {
return controlObjects;
}
public void setControlObjects(ArrayList<PointObject> controlObjects) {
this.controlObjects = controlObjects;
}
/**
* Get a spline point from four provided PointObject objects
* @param p1
* @param p2
* @param p3
* @param p4
* @return
*/
private PointObject calcPoint(PointObject p1, PointObject p2, PointObject p3, PointObject p4){
//calc a point on the bezier curve
PointObject retobject=new PointObject();
//mutliply our matrix by the points which are not in vector form here (no direction needed then)
float basisax=(float) p1.getX();
float basisay=(float) p1.getY();
float basisbx=(float)((-3*p1.getX())+(3*p2.getX()));
float basisby=(float)((-3*p1.getY())+(3*p2.getY()));
float basiscx=(float)((3*p1.getX())+(-6*p2.getX())+(3*p3.getX()));
float basiscy=(float)((3*p1.getY())+(-6*p2.getY())+(3*p3.getY()));
float basisdx=(float)((-1*p1.getX())+(3*p2.getX())-(3*p3.getX())+p4.getX());
float basisdy=(float)((-1*p1.getY())+(3*p2.getY())-(3*p3.getY())+p4.getY());
float t;
//get the solution to our new matrix
for(int i=0;i<order;i++){
t=i/order;
retobject.setX(basisax+t*(basisbx+t*(basiscx+(t*basisdx))));
retobject.setY(basisay+t*(basisby+t*(basiscy+(t*basisdy))));
}
//return the calculated point object
return retobject;
}
/**
* Control the calculation of the spline points
* @return
*/
private ArrayList<PointObject> calcCurve(){
ArrayList<PointObject> po=new ArrayList<PointObject>();
if(controlObjects.size()>0){
//calc bezier curve
int i=0;
//add the initial points
while(i<3 & i<controlObjects.size()){
po.add(controlObjects.get(i));
i++;
}
//add the remaining calculated points
if(controlObjects.size()>3){
for(i=3;i<controlObjects.size();i++){
po.add(calcPoint(controlObjects.get(i),controlObjects.get((i+1)),controlObjects.get((i+2)),controlObjects.get((i+3))));
}
}
}
else{
try{
throw new NullPointerException("No Points Provided!");
}catch(NullPointerException e){
e.printStackTrace();
}
}
return po;
}
/**
* Run the program and get an ArrayList<PointObject> of spline points.
* The number of points returned depends on the number of control points provided.
* @return
*/
public ArrayList<PointObject> getCurvePoints(){
return calcCurve();
}
}