import figure.*;
import java.awt.*;
import javax.swing.*;


public class Parabolas extends FigurePanel implements Function, Mover {
    double[] params;
    GraphicalPoint directrix, focus;
    GraphicalLine line;

    public Parabolas() {
	super(-4, -4, 4, 4);
	setBackground(Color.white);
	
	Grid grid = new Grid();
	grid.setColor(Color.lightGray);
	add(grid);

	Axes axes = new Axes();
	add(axes);

	double f = 0.5;
	focus = new GraphicalPoint(0, f);
	focus.setSize(3);
	focus.setColor(Color.red);

	double d = -1.5;
	directrix = new GraphicalPoint(0, d);
	directrix.setSize(3);
	directrix.setColor(Color.red);

	line = new GraphicalLine(bbox.llx, d, bbox.urx, d);
	line.setStroke(new BasicStroke(2));
	line.setColor(Color.blue);
	add(line);

	params = new double[] {f, d};

	GraphicalFunction func = new GraphicalFunction(this, params);
	func.setStroke(new BasicStroke(2));
	func.setColor(Color.blue);
	add(func);


	add(focus);
	add(directrix);
	addMoveable(focus, this);
	addMoveable(directrix, this);

    }

    public double valueAt(double x, double[] params) {
	double a = params[0] - params[1];
	return x*x/(2*a) + a/2 + params[1];
    }

    public void move(Moveable m, double x, double y) {
	((GraphicalPoint) m).setPoint(0, y);
	params[0] = focus.y;
	params[1] = directrix.y;
	line.setPoints(bbox.llx, directrix.y, bbox.urx, directrix.y);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Parabolas");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Parabolas parabolas = new Parabolas();
        frame.getContentPane().add(parabolas, BorderLayout.CENTER);
        parabolas.setPreferredSize(new Dimension(300, 300));

        frame.pack();
        frame.setVisible(true);
    }

}
