import java.awt.geom.Point2D;
import java.util.ArrayList;


public class Casteljau {


	private ArrayList<Point2D.Double> ctrlPoints = new ArrayList<Point2D.Double>();
	private ArrayList<Point2D.Double> tempPoints = new ArrayList<Point2D.Double>();
	private ArrayList<Point2D.Double> curvePoints = new ArrayList<Point2D.Double>();
	private double t = 0.0;
	private Point2D.Double tmp;

	public Casteljau(){

		ctrlPoints.add(new Point2D.Double(3,-2));	
		ctrlPoints.add(new Point2D.Double(1,3));
		ctrlPoints.add(new Point2D.Double(10,4));
		ctrlPoints.add(new Point2D.Double(8,-5));	

		evalCasteljau();

	}

	public void evalCasteljau(){
		for(double i = t;i<=1.0;i+=0.02){
			tmp = getCasteljauPoint(i);
			curvePoints.add(tmp);
		} 

	}

	public Point2D.Double getCasteljauPoint(double t){

		tempPoints.clear();
		int n = ctrlPoints.size()-1;

		for(int i = 0; i<=n; i++){
			Point2D.Double p = new Point2D.Double(ctrlPoints.get(i).x,ctrlPoints.get(i).y);
			tempPoints.add(i, p);		
		}

		for (int k = 1; k<=n;k++){
			for(int i = 0; i<=n-k; i++){
				tempPoints.get(i).x = t*tempPoints.get(i).x+(1-t)*tempPoints.get(i+1).x;
				tempPoints.get(i).y = t*tempPoints.get(i).y+(1-t)*tempPoints.get(i+1).y;
			}
		}

		return tempPoints.get(0);

	}


	public ArrayList<Point2D.Double> getCtrlPoints(){
		return ctrlPoints;
	}

	public ArrayList<Point2D.Double> getCurvePoints(){
		return curvePoints;
	}

	public ArrayList<Point2D.Double> getTempPoints(){
		return tempPoints;
	}
}
