/* agnesi.java - jpq - 02/02/99
 * jdk1.2 - 22/03/99
 * ajout de main() le 19/12/17 et modification le 14 et 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class agnesi extends Panel implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220914L;
	static Repere R;

// on definit ici les objets mathématiques
	static Pt M, N;
	static PointLibre A;
	static PointSurDroite B, P;
	static Cercle c;
	static Droite d, xpx, dAP;
	static Segment PM, MN, AP;
	double r;
	int gw, gh;

//----------------------------------------------------------------------------
	public agnesi() {
		setBackground (Color.WHITE);
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		g.setFont (new Font ("Arial", Font.PLAIN, 10));
		g.setColor (getBackground());
		if (gw != getSize().width || gh != getSize().height) {
			gw = getSize().width;
			gh = getSize().height;
		
// on initialise ici les objets mathématiques
			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 50.0, 50.0);
				xpx = new Droite (0.0, 1.0, 0.0);
				A = new PointLibre (0.0, 0.0);
				B = new PointSurDroite (1.0, 0.0, xpx);
				d = new Droite (1.0, 0.0, -B.x);
				P = new PointSurDroite (1.0, 1.0, d);
				dAP = new Droite();
				r = B.x / 2.0;
				c = new Cercle (r, 0.0, Math.abs (r));
				N = new Pt();
				M = new Pt();
				PM = new Segment();
				MN = new Segment();
				AP = new Segment();
		} else {
			R.MAJ (R.X (A.x), R.Y (A.y), gw, gh, R.unitex, R.unitex);
			A.MAJ (0.0, 0.0);
		}
		g.fillRect (0, 0, R.XMAX, R.YMAX);
	}

// on trace dans la couleur du fond les objets liés
		if (A.deplace || B.deplace) {
			if (A.deplace) {
				R.MAJ (R.X (A.x), R.Y (A.y), gw, gh, R.unitex, R.unitex);
				A.MAJ (0.0, 0.0);
			}
			g.fillRect (0, 0, R.XMAX, R.YMAX);
		} else {
			P.trace ("P", R, g);
			AP.trace ("", R, g);
			PM.trace ("", R, g);
			MN.trace ("", R, g);
			M.traceNom ("M", R, g);
			N.traceNom ("N", R, g);
		}

// on recalcule les objets liés
		if (B.deplace) {
			d.MAJ (1.0, 0.0, -B.x);
			r = B.x / 2.0;
			c.MAJ (r, 0.0, Math.abs (r));
			P.MAJ();
		}
		dAP.MAJ (-P.y, B.x, 0.0);
		Pt[] Ni = Pt.intersection (dAP, c);
		N.MAJ ((Ni[0].x == 0.0)? Ni[1] : Ni[0]);
		M.MAJ (N.x, P.y);
		PM.MAJ (P, M);
		MN.MAJ (M, N);
		AP.MAJ (A, P);

// on trace
//		g.setColor (Color.BLACK);
//		R.cadre (g);

		g.setColor (Color.MAGENTA);
		c.trace ("", R, g);

		g.setColor (Color.CYAN);
		d.trace ("", R, g);

		g.setColor (Color.BLUE);
		AP.trace ("", R, g);
		PM.trace ("", R, g);
		MN.trace ("", R, g);

		g.setColor (Color.YELLOW);
		R.trace (g);

		g.setColor (Color.RED);
		A.trace ("A", R, g);
		B.trace ("B", R, g);
		if (P.deplace)
			P.trace ("", R, g);
		else
			P.trace ("P", R, g);

		g.setColor (Color.BLACK);
		M.trace ("M", R, g);
		N.traceNom ("N", R, g);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if (P.deplace = P.zone (X, Y, R)) {
			repaint();
		} else if (B.deplace = B.zone (X, Y, R)) {
		} else if (A.deplace = A.zone (X, Y, R)) {
		}
	}

	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		P.bouge (X, Y, R);
		B.bouge (X, Y, R);
		A.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		P.deplace = B.deplace = A.deplace = false;
		repaint();
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (P.zone (X, Y, R) || B.zone (X, Y, R) || A.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) {
		agnesi a = new agnesi();
		JFrame f = new JFrame ("La cubique d'Agnesi");
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		f.add (a);
		f.setSize (400, 400);
		f.setVisible (true);
	}

}

