/**
 * neufpts.java - jpq - 22/01/99
 * 21/03/99 - jdk1.2 - double-buffering
 * modification et ajout de main() le 26/12/17 ; modification le 05, le 09, le 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class neufpts extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	static Image img;
	static Graphics g;
	static Repere Rep;
	int gw, gh;

	static PointLibre A, B, C;
	static Segment AB, BC, CA, UO, VO, WO, AP, BQ, CR, AH, BH, CH, OH, AJ, BJ, CJ, Jab, Jbc, Jca;
	static Pt U, V, W, O, P, Q, R, H, L, M, N, G, I, J, K, Ja, Jb, Jc, Ka, Kb, Kc;
	static Droite dUO, dVO, dAP, dBQ, dbA, dbB, dbeA, dbeB, dbeC;
	static Cercle C9pts, Ci, Cea, Ceb, Cec;

	public neufpts() {
		super ("Le cercle des neuf points");
		addMouseMotionListener (this);
		addMouseListener (this);
		setBackground (Color.WHITE);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		setSize (600, 600);
		setVisible (true);
	}

	public void update (Graphics g1) {
		paint (g1);
	}

	public void paint (Graphics g1) {
		if (img == null || gw != getSize().width || gh != getSize().height) {
			gw = getSize().width;
			gh = getSize().height;
			img = createImage (gw, gh);
			g = img.getGraphics ();
			g.setFont (new Font ("Arial", Font.PLAIN, 14));
			if (Rep == null) {
				Rep = new Repere (gw / 2, gh / 2, gw, gh, 20.0, 20.0);
				A = new PointLibre (0.0, 6.0);
				B = new PointLibre (-6.0, 0.0);
				C = new PointLibre (7.0, -5.0);
				AB = new Segment();
				BC = new Segment();
				CA = new Segment();
/*				U = new Pt();
				V = new Pt();
				W = new Pt();
				dUO = new Droite();
				dVO = new Droite(); */
				O = new Pt();
				UO = new Segment();
				VO = new Segment();
				WO = new Segment();
/*				dAP = new Droite();
				dBQ = new Droite();
				H = new Pt();
				P = new Pt();
				Q = new Pt();
				R = new Pt(); */
				AP = new Segment();
				BQ = new Segment();
				CR = new Segment();
				AH = new Segment();
				BH = new Segment();
				CH = new Segment();
/*				L = new Pt();
				M = new Pt();
				N = new Pt();
				G = new Pt();
				I = new Pt(); */
				OH = new Segment();
				C9pts = new Cercle();
				dbA = new Droite();
				dbB = new Droite();
/*				J = new Pt();
				K = new Pt(); */
				AJ = new Segment();
				BJ = new Segment();
				CJ = new Segment();
				Ci = new Cercle();
				dbeA = new Droite();
				dbeB = new Droite();
				dbeC = new Droite();
/*				Ja = new Pt();
				Jb = new Pt();
				Jc = new Pt();
				Ka = new Pt();
				Kb = new Pt();
				Kc = new Pt(); */
				Jab = new Segment();
				Jbc = new Segment();
				Jca = new Segment();
				Cea = new Cercle();
				Ceb = new Cercle();
				Cec = new Cercle();
			} else {
				Rep.MAJ (gw / 2, gh / 2, gw, gh, 20.0, 20.0);
			}
		}
		g.setColor (getBackground ());
		g.fillRect (0, 0, Rep.XMAX, Rep.YMAX);

		AB.MAJ (A, B);
		BC.MAJ (B, C);
		CA.MAJ (C, A);
		U = Pt.milieu (B, C);
		V = Pt.milieu (C, A);
		W = Pt.milieu (A, B);
		dUO = Droite.mediatrice (B, C);
		dVO = Droite.mediatrice (C, A);
		O = Pt.intersection (dUO, dVO);
		UO.MAJ (U, O);
		VO.MAJ (V, O);
		WO.MAJ (W, O);
		dAP = Droite.perpendiculaire (BC, A);
		dBQ = Droite.perpendiculaire (CA, B);
		H = Pt.intersection (dAP, dBQ);
		P = A.projection (BC);
		Q = B.projection (CA);
		R = C.projection (AB);
		AP.MAJ (A, P);
		BQ.MAJ (B, Q);
		CR.MAJ (C, R);
		AH.MAJ (A, H);
		BH.MAJ (B, H);
		CH.MAJ (C, H);
		L = Pt.milieu (A, H);
		M = Pt.milieu (B, H);
		N = Pt.milieu (C, H);
		OH.MAJ (O, H);
		I = Pt.milieu (O, H);
		G = O.homothetie (H, 2.0 / 3.0);
		C9pts.MAJ (I, U);
		dbA = Droite.bissectrice (B, A, C);
		dbB = Droite.bissectrice (C, B, A);
		J = Pt.intersection (dbA, dbB);
		AJ.MAJ (A, J);
		BJ.MAJ (B, J);
		CJ.MAJ (C, J);
		K = J.projection (AB);
		Ci.MAJ (J, K);
		dbeA = dbA.perpendiculaire (A);
		dbeB = dbB.perpendiculaire (B);
		dbeC = CJ.perpendiculaire (C);
		Ja = Pt.intersection (dbeB, dbeC);
		Jb = Pt.intersection (dbeC, dbeA);
		Jc = Pt.intersection (dbeA, dbeB);
		Jab.MAJ (Ja, Jb);
		Jbc.MAJ (Jb, Jc);
		Jca.MAJ (Jc, Ja);
		Ka = Ja.projection (BC);
		Kb = Jb.projection (CA);
		Kc = Jc.projection (AB);
		Cea.MAJ (Ja, Ka);
		Ceb.MAJ (Jb, Kb);
		Cec.MAJ (Jc, Kc);

// on trace
		g.setColor (Color.BLACK);
		Rep.cadre (g);
		OH.trace ("", Rep, g);
		G.trace ("G", Rep, g);
		I.trace ("I", Rep, g);

		g.setColor (Color.YELLOW);
		AJ.trace ("", Rep, g);
		BJ.trace ("", Rep, g);
		CJ.trace ("", Rep, g);
		Ci.trace ("", Rep, g);
		Jab.trace ("", Rep, g);
		Jbc.trace ("", Rep, g);
		Jca.trace ("", Rep, g);
		Cea.trace ("", Rep, g);
		Ceb.trace ("", Rep, g);
		Cec.trace ("", Rep, g);

		g.setColor (Color.BLUE);
		AB.trace ("", Rep, g);
		BC.trace ("", Rep, g);
		CA.trace ("", Rep, g);

		g.setColor (Color.GREEN);
		O.trace ("O", Rep, g);
		UO.trace ("", Rep, g);
		VO.trace ("", Rep, g);
		WO.trace ("", Rep, g);

		g.setColor (Color.MAGENTA);
		H.trace ("H", Rep, g);
		AP.trace ("", Rep, g);
		BQ.trace ("", Rep, g);
		CR.trace ("", Rep, g);
		AH.trace ("", Rep, g);
		BH.trace ("", Rep, g);
		CH.trace ("", Rep, g);

		g.setColor (Color.CYAN);
		C9pts.trace ("", Rep, g);

		g.setColor (Color.BLACK);
		U.trace ("U", Rep, g);
		V.trace ("V", Rep, g);
		W.trace ("W", Rep, g);
		P.trace ("P", Rep, g);
		Q.trace ("Q", Rep, g);
		R.trace ("R", Rep, g);
		L.trace ("L", Rep, g);
		M.trace ("M", Rep, g);
		N.trace ("N", Rep, g);

		g.setColor (Color.RED);
		A.trace ("A", Rep, g);
		B.trace ("B", Rep, g);
		C.trace ("C", Rep, g);

		g1.drawImage (img, 0, 0, this);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if (A.deplace = A.zone (X, Y, Rep)) {
		} else if (B.deplace = B.zone (X, Y, Rep)) {
		} else if (B.deplace = B.zone (X, Y, Rep)) {
		} else if (C.deplace = C.zone (X, Y, Rep)) {
		}
	}

	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		A.bouge (X, Y, Rep);
		B.bouge (X, Y, Rep);
		C.bouge (X, Y, Rep);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		A.deplace = B.deplace = C.deplace = false;
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (A.zone (X, Y, Rep) || B.zone (X, Y, Rep) || C.zone (X, Y, Rep)) {
			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) {
		new neufpts();
	}

}
