/**
 * triangle.java - jpq - 10/11/98
 * 21/03/99 - jdk1.2 - double-buffering
 * modification et ajout de main() le 25/12/17 ; modification le 03 et le 12/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class triangle extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	static Image img;
	static Graphics g;
	int X, Y;
	int gw, gh;
	boolean recalcul;

//---------- définition des objets mathématiques
	static Repere R;
	static PointLibre A, B, C;
	static Pt I, J, K, G, O, O1, h1, h2, h3, H;
	static Segment AB, BC, CA, AI, BJ, CK, AH1, BH2, CH3, AH, BH, CH;
	static Droite ai, bj, BISSA, BISSB, BISSC, ah1, bh2, MEDI, MEDJ, MEDK;
	static Cercle CC, CI;

	public triangle(String titre) {
		super (titre);
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	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 (Font.SANS_SERIF, Font.PLAIN, 10));

//---------- initialisation des objets mathématiques
			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 20.0, 20.0);
				A = new PointLibre (0.0, 5.0);
				B = new PointLibre (-6.0, 0.0);
				C = new PointLibre (7.0, -5.0);
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 20.0, 20.0);
			}
		}
		g.setColor (getBackground ());
		g.fillRect (0, 0, R.XMAX, R.YMAX);

//---------- recalcul des objets liés
			AB = new Segment (A, B);
			BC = new Segment (B, C);
			CA = new Segment (C, A);
			I = Pt.milieu (B, C);
			J = Pt.milieu (C, A);
			K = Pt.milieu (A, B);
			AI = new Segment (A, I);
			Droite dAI = new Droite (A, I);
			BJ = new Segment (B, J);
			Droite dBJ = new Droite (B, J);
			CK = new Segment (C, K);
			G = dAI.intersection (dBJ);
			MEDI = BC.perpendiculaire (I);
			MEDJ = CA.perpendiculaire (J); 
			MEDK = AB.perpendiculaire (K);
			O = MEDI.intersection (MEDJ);
			CC = new Cercle (A, B, C); 
			BISSA = Droite.bissectrice (C, A, B); 
			BISSB = Droite.bissectrice (A, B, C); 
			BISSC = Droite.bissectrice (B, C, A);
			O1 = BISSA.intersection (BISSB);
			h1 = A.projection (BC);
			AH1 = new Segment (A, h1);
			h2 = B.projection (CA);
			BH2 = new Segment (B, h2);
			h3 = C.projection (AB);
			CH3 = new Segment (C, h3);
			ah1 = new Droite (A, h1);
			bh2 = new Droite (B, h2);
			H = ah1.intersection (bh2);
			AH = new Segment (A, H);
			BH = new Segment (B, H);
			CH = new Segment (C, H);
			CI = new Cercle (O1, O1.distance (AB));

//---------- dessin des objets
		g.setColor (Color.BLUE);
		A.trace ("A", R, g);
		B.trace ("B", R, g);
		C.trace ("C", R, g);
		AB.trace (null, R, g);
		BC.trace (null, R, g);
		CA.trace (null, R, g);

		g.setColor (Color.GREEN);
		I.trace ("I", R, g);
		J.trace ("J", R, g);
		K.trace ("K", R, g);
		AI.trace (null, R, g);
		BJ.trace (null, R, g);
		CK.trace (null, R, g);
		G.trace ("G", R, g);

		g.setColor (Color.RED);
		MEDI.trace (null, R, g);
		MEDJ.trace (null, R, g);
		MEDK.trace (null, R, g);
		O.trace ("O", R, g);
		CC.trace (null, R, g);

		g.setColor (Color.YELLOW);
		BISSA.trace (null, R, g);
		BISSB.trace (null, R, g);
		BISSC.trace (null, R, g);
		O1.trace ("O1", R, g);
		CI.trace (null, R, g);

		g.setColor (Color.BLACK);
		R.cadre (g);
		AH1.trace (null, R, g);
		BH2.trace (null, R, g);
		CH3.trace (null, R, g);
		H.trace ("H", R, g);
		AH.trace (null, R, g);
		BH.trace (null, R, g);
		CH.trace (null, R, g);

		g1.drawImage (img, 0, 0, this);

	}

//---------- teste si on a cliqué à proximité d'un geo.Point libre ou libre sur objet d'un geo.Point
	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if (A.deplace = A.zone (X, Y, R)) {
		} else if (B.deplace = B.zone (X, Y, R)) {
		} else if (C.deplace = C.zone (X, Y, R)) {
		}
	}

//---------- bouge le geo.Point sélectionné
	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		A.bouge (X, Y, R);
		B.bouge (X, Y, R);
		C.bouge (X, Y, R);
		repaint ();
	}

//---------- points refixés
	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, R) || B.zone (X, Y, R) || C.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) {
		triangle t = new triangle ("triangle");
		t.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		t.setSize (600, 600);
		t.setVisible (true);
	}

}
