package curves; import java.util.ArrayList; /** * Hermite Spline calculator created using PMT(t). Hermetic curves pass directly through * the points provided and may be handy in our situation. * * @author asevans * */ public class Hermite{ private int order=4; private ArrayList<PointObject> controlObjects; public Hermite(){ } 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 Point from a hermite curve from four PointObject objects * by reducing the matrix equation from right to left. * * @param p1 * @param p2 * @param p3 * @param p4 * @return */ private PointObject calcPoint(PointObject p1, PointObject p2, PointObject p3, PointObject p4){ PointObject retobject=new PointObject(); float basisax=(float)((2*p1.getX())-(2*p2.getX())+p3.getX()+p4.getX()); float basisay=(float)((2*p1.getY())-(2*p2.getY())+p3.getY()+p4.getY()); float basisbx=(float)((-3*p1.getX())+(3*p2.getX())-(2*p3.getX())-p4.getX()); float basisby=(float)((-3*p1.getY())+(3*p2.getY())-(2*p3.getY())-p4.getY()); float basiscx=(float)p3.getX(); float basiscy=(float)p3.getY(); float basisdx=(float)p1.getX(); float basisdy=(float)p1.getY(); float t; //get the vector determinant for(int i=0;i<(order-1);i++){ t=i/order; retobject.setX(((basiscx+t*(basisbx+t*basisax))*t+basisdx)); retobject.setY(((basiscy+t*(basisby+t*basisay))*t+basisdy)); } return retobject; } /** * Calculates a hermite curve * @return */ private ArrayList<PointObject> calcCurvePoints(){ //TODO calculate the hermite curve ArrayList<PointObject> po=new ArrayList<PointObject>(); int start=0; if(controlObjects.size()>=3) { po.add(controlObjects.get(0)); po.add(controlObjects.get(1)); po.add(controlObjects.get(2)); if(controlObjects.size()>3){ for(int i=3;i<controlObjects.size();i++){ po.add(calcPoint(controlObjects.get(start),controlObjects.get((start+1)),controlObjects.get(start+2),controlObjects.get(start+3))); } } } else { if(controlObjects==null) { try{ throw new NullPointerException("No Control Points Provided"); }catch(NullPointerException e){ e.printStackTrace(); } } else{ for(int i=0;i<controlObjects.size();i++){ po.add(controlObjects.get(i)); } } } 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 calcCurvePoints(); } }