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(); } }