import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.*;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;



public class DrawCasteljau extends JFrame{

	GLCanvas canvas;
	SceneView sv;

	public DrawCasteljau() {

		sv = new SceneView(); //GLEventListener-Objekt

		GLProfile glp = GLProfile.getDefault();
		GLCapabilities caps = new GLCapabilities(glp);
		canvas = new GLCanvas(caps);

		canvas.addGLEventListener(sv);

		add(canvas);

		setTitle("Casteljau");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,500);
		setVisible(true);  

	}



	class SceneView implements GLEventListener {

		Casteljau casteljau = new Casteljau();
		ArrayList<Point2D.Double> ctrlPoints = casteljau.getCtrlPoints();
		ArrayList<Point2D.Double> curvePoints = casteljau.getCurvePoints();



		public void init(GLAutoDrawable drawable) {
			GL2 gl = drawable.getGL().getGL2(); 
			gl.glClearColor(1, 1, 1, 0f); // grey background	

		}

		public void display(GLAutoDrawable drawable) {
			GL2 gl = drawable.getGL().getGL2();         
			gl.glClear(GL2.GL_COLOR_BUFFER_BIT); // clear background

			gl.glColor3d(0, 0, 1);	//blue
			gl.glBegin(GL2.GL_LINE_STRIP); 
			for(int i = 0; i<curvePoints.size();i++){	
				gl.glVertex3d(curvePoints.get(i).x, curvePoints.get(i).y, 0);
			}
			gl.glEnd();

			gl.glColor3d(1, 0, 0);	//red
			gl.glPointSize(5.0f);
			gl.glBegin(GL2.GL_POINTS); 
			for(int i = 0; i<ctrlPoints.size();i++){
				gl.glVertex3d(ctrlPoints.get(i).x, ctrlPoints.get(i).y, 0);
			}
			gl.glEnd();

			gl.glBegin(GL2.GL_LINE_STRIP); 
			for(int i = 0; i<ctrlPoints.size();i++){
				gl.glVertex3d(ctrlPoints.get(i).x, ctrlPoints.get(i).y, 0);
			}
			gl.glEnd();
		}

		public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
			GL2 gl = drawable.getGL().getGL2();
			gl.glViewport(Math.max(0,(w-h)/2), Math.max(0,(h-w)/2), Math.min(w,h), Math.min(w,h)); //reset the current viewport
			gl.glMatrixMode(GL2.GL_PROJECTION);
			gl.glLoadIdentity();
			gl.glOrtho(-1,15,-8,8,-1,100);
		}

		public void dispose(GLAutoDrawable drawable) {
		}


	}

	public static void main(String args[]) {
		new DrawCasteljau();   
	}




}

