/**
 * illustration du théorème de Pappus
 *
 * pappus.java - jpq - 10/11/98
 * 21/03/99 - jdk1.2 - double-buffering
 * modification et ajout de main() le 26/12/17, modification le 04, 09 et le 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class pappus extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	static Image img;
	static Graphics g;
	int gw, gh;

// définition des objets mathématiques
	static Repere R;
	static PointLibre A, C, D, F;
	static PointSurDroite B, E; 
	static Pt G, H, I;
	static Droite AC, DF, AE, AF, BD, BF, CD, CE;
	static Segment GH, HI, GI;
	static Cercle c;
	static PointSurCercle T;

	public pappus (String titre) {
		super (titre);
		addMouseMotionListener (this);
		addMouseListener (this);
		setBackground (Color.WHITE);
	}

	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, 10));
			if (R == null) {

//---------- initialisation des objets mathématiques
				R = new Repere (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
				A = new PointLibre (-12.0, 6.0);
				C = new PointLibre (12.0, 8.0);
				AC = new Droite (A, C);
				B = new PointSurDroite (0.0, 0.0, AC);
				D = new PointLibre (-12.0, -6.0);
				F = new PointLibre (12.0, -8.0);
				DF = new Droite (D, F);
				E = new PointSurDroite (1.0, 1.0, DF);
				AE = new Droite (A, E);
				AF = new Droite (A, F);
				BD = new Droite (B, D);
				BF = new Droite (B, F);
				CD = new Droite (C, D);
				CE = new Droite (C, E);
				GH = new Segment();
				HI = new Segment();
				GI = new Segment();
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 20.0, 20.0);
			}
		}
		g.setColor (getBackground ());
		g.fillRect (0, 0, R.XMAX, R.YMAX);

// recalcule la position des différents objets
		AC.MAJ (A, C);
		B.MAJ();
		DF.MAJ (D, F);
		E.MAJ();
		AE.MAJ (A, E);
		AF.MAJ (A, F);
		BD.MAJ (B, D);
		BF.MAJ (B, F);
		CD.MAJ (C, D);
		CE.MAJ (C, E);
		G = AE.intersection (BD);
		H = AF.intersection (CD);
		I = BF.intersection (CE);
		GH.MAJ (G, H);
		HI.MAJ (H, I);
		GI.MAJ (G, I);

// dessine la figure, les points en dernier pour plus de visibilité
		g.setColor (Color.GREEN);
		AC.trace ("", R, g);

		g.setColor (Color.BLUE);
		DF.trace ("", R, g);

		g.setColor (Color.YELLOW);
		AE.trace ("", R, g);
		AF.trace ("", R, g);
		BD.trace ("", R, g);
		BF.trace ("", R, g);
		CD.trace ("", R, g);
		CE.trace ("", R, g);

		g.setColor (Color.RED);
		GH.trace ("", R, g);
		HI.trace ("", R, g);
		GI.trace ("", R, g);

		g.setColor (Color.GREEN);
		A.trace ("A", R, g);
		B.trace ("B", R, g);
		C.trace ("C", R, g);

		g.setColor (Color.BLUE);
		D.trace ("D", R, g);
		E.trace ("E", R, g);
		F.trace ("F", R, g);

		g.setColor (Color.RED);
		G.trace ("G", R, g);
		H.trace ("H", R, g);
		I.trace ("I", R, g);

		g.setColor (Color.BLACK);
		R.cadre (g);

		g1.drawImage (img, 0, 0, this);
	}

// teste si le clic de la souris s'est produit à proximité du point A, B, C, D, E ou F
	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)) {
		} else if (D.deplace = D.zone (X, Y, R)) {
		} else if (E.deplace = E.zone (X, Y, R)) {
		} else if (F.deplace = F.zone (X, Y, R)) {
		}
	}

// déplacement éventuel du 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);
		D.bouge (X, Y, R);
		E.bouge (X, Y, R);
		F.bouge (X, Y, R);
		repaint();
	}

// fin du déplacement
	public void mouseReleased (MouseEvent e) {
		A.deplace = B.deplace = C.deplace = D.deplace = E.deplace = F.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) || D.zone (X, Y, R) || E.zone (X, Y, R) || F.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) {
		pappus p = new pappus ("Théorème de Pappus");
		p.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		p.setSize (600, 600);
		p.setVisible (true);
	}

}
