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