/**
 * testgeo6.java	22/09/22
 * auteur : Jean-Paul Quelen
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class testgeo6 extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	int w, h;
	static Image img;
	static Graphics g1;
	static Repere R;
	static PointLibre O;
	static PointSurDroite U;
	static Droite OU;
	static CourbeFonction cf1, cf2, cf3;

	public testgeo6 (String titre) {
		super (titre);
		setFont (new Font ("Arial", Font.PLAIN, 12));
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		int w1 = getWidth();
		int h1 = getHeight();
		if ((img == null) || (w1 != w) || (h1 != h)) {
			w = w1;
			h = h1;
			img = createImage (w, h);
			g1 = img.getGraphics();
			if (R == null) {
				R = new Repere (w / 2, h / 2, w, h, 10.0, 10.0);
				O = new PointLibre (0.0, 0.0);
				OU = new Droite (0.0, 1.0, 0.0);					// axe des x
				U = new PointSurDroite (1.0, 0.0, OU);
				cf1 = new CourbeFonction (new Rac2());
				cf2 = new CourbeFonction (new Inverse());
				cf3 = new CourbeFonction (new carre());
			}
		}

		R.MAJ (R.X (O.x), R.Y (O.y), w, h, R.unitex, R.unitex);
		O.MAJ (0.0, 0.0);
		if (U.deplace && (U.x > 0)) {
			R.unitex = R.unitey = O.distance (U) * R.unitex;
		}
		U.MAJ (1.0, 0.0);

		g1.setColor (Color.WHITE);
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

		g1.setColor (Color.GREEN);
		R.trace (g1);

		g1.setColor (Color.BLUE);
		cf1.trace ("y=sqrt(2)", R, g1);

		g1.setColor (Color.BLACK);
		cf2.trace ("y=1/x", R, g1);

		g1.setColor (Color.MAGENTA);
		cf3.trace ("y=x²", R, g1);

		g1.setColor (Color.RED);
		O.trace ("O", R, g1);
		U.trace ("U", R, g1);
		
		g.drawImage (img, 0, 0, this);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if ((U.deplace = U.zone (X, Y, R)) || (O.deplace = O.zone (X, Y, R))) {}
	}

	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		U.bouge (X, Y, R);
		O.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		U.deplace = O.deplace = false;
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (U.zone (X, Y, R) || O.zone (X, Y, R)) {
			setCursor (new Cursor (Cursor.HAND_CURSOR));
		} else {
			setCursor (new Cursor (Cursor.DEFAULT_CURSOR));
		}
	}

public void mouseClicked (MouseEvent e) {}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}

	public static void main (String args[]) {
		testgeo6 appl = new testgeo6 ("testgeo");
		appl.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		appl.setSize (400, 300);
		appl.setVisible (true);
	}

/**
 * fonction x²
 */

protected class carre extends Fonction {

	public boolean defini (double x) {
		return true;
	}

	public double Image (double x) {
		return x * x;
	}

}

/**
 * fonction Rac2
 */

protected class Rac2 extends Fonction {

	public boolean defini (double x) {
		return x >= 0.0;
	}

	public double Image (double x) {
		return Math.sqrt (x);
	}

}

/**
 * fonction inverse
 */

protected class Inverse extends Fonction {

	public boolean defini (double x) {
		return x != 0.0;
	}

	public double Image (double x) {
		return 1.0 / x;
	}

}

}
