/** triseceva.java - jpq - 20/03/99 - jdk 1.2
 * main() ajouté le 19/12/17 ; modifications le 15 et 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class triseceva extends Panel implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	static Repere R;

	static PointLibre A;
	static Pt D, H, M, G;
	static PointSurDroite I;
	static PointSurCercle Q;
	static Droite xpx, dAQ;
	static Cercle c;
	static Segment AM, AD, DM, DQ, AQ;
	int gw, gh;

//----------------------------------------------------------------------------
	public triseceva() {
		setBackground (Color.WHITE);
		addMouseMotionListener (this);
		addMouseListener (this); 
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		g.setFont (new Font (Font.SANS_SERIF, Font.PLAIN, 10));
		g.setColor (getBackground());
		if (gw != getSize().width || gh != getSize().height) {
			gw = getSize().width;
			gh = getSize().height;
			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 40.0, 40.0);
				A = new PointLibre (0.0, 0.0);
				xpx = new Droite (0.0, 1.0, 0.0);
				I = new PointSurDroite (1.0, 0.0, xpx);
				c = new Cercle (A, I);
				Q = new PointSurCercle (0.125 * Math.PI, c);
				dAQ = new Droite();
				H = new Pt();
				G = new Pt();
				D = new Pt();
				M = new Pt();
				AM = new Segment();
				AD = new Segment();
				DM = new Segment();
				DQ = new Segment();
				AQ = 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);
		}
		if ((A.deplace) || (I.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 {

// on trace dans la couleur du fond les objets liés
			AM.trace ("", R, g);
			AD.trace ("", R, g);
			DM.trace ("", R, g);
			DQ.trace ("", R, g);
			AQ.trace ("", R, g);
			A.traceNom ("A", R, g);
			D.traceNom ("D", R, g);
			M.traceNom ("M", R, g);
			Q.trace ("Q", R, g);
		}

// on recalcule les objets liés
		c.MAJ (A, I);
		Q.MAJ();
		H.MAJ (Q.x, 0.0);
		D = A.symetrie (H);
		dAQ.MAJ (A, Q);
		G = D.projection (dAQ);
		M = Q.symetrie (G);
		AM.MAJ (A, M);
		AD.MAJ (A, D);
		DM.MAJ (D, M);
		DQ.MAJ (D, Q);
		AQ.MAJ (A, Q);

// on trace
//		g.setColor (Color.BLACK);
//		R.cadre (g);

		g.setColor (Color.YELLOW);
		R.trace (g);

		g.setColor (Color.MAGENTA);
		c.trace ("", R, g);

		g.setColor (Color.BLUE);
		AM.trace ("", R, g);
		AD.trace ("", R, g);
		DM.trace ("", R, g);
		DQ.trace ("", R, g);
		AQ.trace ("", R, g);
		D.traceNom ("D", R, g);

		g.setColor (Color.BLACK);
		M.trace ("M", R, g);

		g.setColor (Color.RED);
		I.trace ("I", R, g);
		A.trace ("A", R, g);
		if (Q.deplace)
			Q.trace ("", R, g);
		else
			Q.trace ("Q", R, g);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if (Q.deplace = Q.zone (X, Y, R)) {
			repaint();
		} else if (I.deplace = I.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();
		Q.bouge (X, Y, R);
		I.bouge (X, Y, R);
		A.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		Q.deplace = I.deplace = A.deplace = false;
		repaint();
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (Q != null && Q.zone (X, Y, R) || I != null && I.zone (X, Y, R) || A != null && 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) {
		triseceva t = new triseceva();
		JFrame f = new JFrame ("La trisectrice de Céva");
		f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		f.add (t);
		f.setSize (600, 600);
		f.setVisible (true);
	}

}
