/**
 * danois.java - jpq - 04/12/98
 * 21/03/99 - jdk1.2 - double-buffering
 * modification et ajout de main() le 25/12/17 - 04, 09 et 22/09/22
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class danois extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220904L;
	static Image img;
	static Graphics g;
	static Repere R;

// on definit ici les objets mathématiques
	static Pt O, A1, B1, C1, B2, C2, D2, B3, D3;
	static PointLibre P;
	static Cercle c;
	static PointSurCercle A, B, C, D;
	static Segment AB, BC, CD, DA, a3a2, c2c3, c1c4, b4b1, a3b4, a4b3, a1b2, a2b1;
	static Droite C1BA, B1AC, A1CB, C1BD, C2DB, B2CD, D2AC, A1CD, C2DA, D2AB, D3BA, B3DA;
	static Droite bac, acb, acd, cda, bdc, dbc, abd, bad;
	static Pt a1, b1, c1, a2, b2, c2, a3, b3, c3, a4, b4, c4, d1, d2, d3, d4;
	double na3, na4, nc2;
	int gw, gh;

//----------------------------------------------------------------------------
	public danois(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));

//---------- initialisation des objets mathématiques
			if (R == null) {
				R = new Repere (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
				O = new Pt (0.0, 0.0);
				P = new PointLibre (5.5, 0.0);
				c = new Cercle (O, P);
				A = new PointSurCercle (0.8, c);
				B = new PointSurCercle (2.3, c); 
				C = new PointSurCercle (-3.0, c); 
				D = new PointSurCercle (-1.2, c);
				AB = new Segment (A, B);
				BC = new Segment (B, C);
				CD = new Segment (C, D);
				DA = new Segment (D, A);
				a3a2 = new Segment();
				c2c3 = new Segment();
				c1c4 = new Segment();
				b4b1 = new Segment();
				a3b4 = new Segment();
				a4b3 = new Segment();
				a1b2 = new Segment();
				a2b1 = new Segment();
			} else {
				R.MAJ (gw / 2, gh / 2, gw, gh, 10.0, 10.0);
			}
		}

// on recalcule les objets liés
			c.MAJ (O, P);
			A.MAJ();
			B.MAJ();
			C.MAJ();
			D.MAJ();
			AB.MAJ (A, B);
			BC.MAJ (B, C);
			CD.MAJ (C, D);
			DA.MAJ (D, A);
			A1 = A.symetrie (C);
			B1 = B.symetrie (A);
			C1 = C.symetrie (B);
			C1BA = Droite.bissectrice (C1, B, A);
			B1AC = Droite.bissectrice (B1, A, C);
			A1CB = Droite.bissectrice (A1, C, B);
			a1 = C1BA.intersection (B1AC);
			b1 = B1AC.intersection (A1CB);
			c1 = A1CB.intersection (C1BA);
			B2 = B.symetrie (C);
			C2 = C.symetrie (D);
			C1BD = Droite.bissectrice (D, B, C1);
			C2DB = Droite.bissectrice (C2, D, B);
			B2CD = Droite.bissectrice (B2, C, D);
			a2 = C1BD.intersection (C2DB);
			b2 = C2DB.intersection (B2CD);
			c2 = B2CD.intersection (C1BD);
			D2 = D.symetrie (A);
			D2AC = Droite.bissectrice (D2, A, C);
			A1CD = Droite.bissectrice (A1, C, D);
			C2DA = Droite.bissectrice (C2, D, A);
			a3 = D2AC.intersection (A1CD);
			b3 = A1CD.intersection (C2DA);
			c3 = C2DA.intersection (D2AC);
			B3 = B.symetrie (D);
			D3 = D.symetrie (B);
			D2AB= Droite.bissectrice (D2, A, B);
			D3BA= Droite.bissectrice (D3, B, A);
			B3DA= Droite.bissectrice (B3, D, A);
			a4 = D2AB.intersection (D3BA);
			b4 = D3BA.intersection (B3DA);
			c4 = B3DA.intersection (D2AB);
			na3 = O.distance (a3);
			na4 = O.distance (a4);
			nc2 = O.distance (c2);
			if ((na3 >= na4) && (na3 >= nc2)) {
				a3a2.MAJ (a3, a2);
				c2c3.MAJ (c2, c3);
				c1c4.MAJ (c1, c4);
				b4b1.MAJ (b4, b1);
				a3b4.MAJ (a3, b4);
				a4b3.MAJ (a4, b3);
				a1b2.MAJ (a1, b2);
				a2b1.MAJ (a2, b1);
			} else if ((na4 >= na3) && (na4 >= nc2)) {
				a3a2.MAJ (b3, a1);
				c2c3.MAJ (c1, c3);
				c1c4.MAJ (c2, c4);
				b4b1.MAJ (a4, b2);
				a3b4.MAJ (b3, a4);
				a4b3.MAJ (b4, a3);
				a1b2.MAJ (a2, b1);
				a2b1.MAJ (a1, b2);
			} else if ((nc2 >= na3) && (nc2 >= na3)) {
				a3a2.MAJ (c1, c3);
				c2c3.MAJ (b3, a1);
				c1c4.MAJ (b2, a4);
				b4b1.MAJ (c4, c2);
				a3b4.MAJ (c1, c4);
				a4b3.MAJ (b4, b1);
				a1b2.MAJ (a2, a3);
				a2b1.MAJ (c3, c2);
			}
			bac = Droite.bissectrice (B, A, C);
			acb = Droite.bissectrice (A, C, B);
			acd = Droite.bissectrice (A, C, D);
			cda = Droite.bissectrice (C, D, A);
			bdc = Droite.bissectrice (B, D, C);
			dbc = Droite.bissectrice (D, B, C);
			abd = Droite.bissectrice (A, B, D);
			bad = Droite.bissectrice (B, A, D);
			d1 = bac.intersection (acb);
			d2 = acd.intersection (cda);
			d3 = bdc.intersection (dbc);
			d4 = abd.intersection (bad);

// on trace
		g.setColor (getBackground());
		g.fillRect (0, 0, R.XMAX, R.YMAX);

		g.setColor (Color.BLACK);
		R.cadre (g);
		c.trace ("", R, g);

		g.setColor (Color.BLUE);
		AB.trace ("", R, g);
		BC.trace ("", R, g);
		CD.trace ("", R, g);
		DA.trace ("", R, g);

		g.setColor (Color.GREEN);
		a3a2.trace ("", R, g);
		c2c3.trace ("", R, g);
		c1c4.trace ("", R, g);
		b4b1.trace ("", R, g);
		a3b4.trace ("", R, g);
		a4b3.trace ("", R, g);
		a1b2.trace ("", R, g);
		a2b1.trace ("", R, g);

		g.setColor (Color.BLUE);
		a1.trace ("", R, g);
		b1.trace ("", R, g);
		c1.trace ("", R, g);
		a2.trace ("", R, g);
		b2.trace ("", R, g);
		c2.trace ("", R, g);
		a3.trace ("", R, g);
		b3.trace ("", R, g);
		c3.trace ("", R, g);
		a4.trace ("", R, g);
		b4.trace ("", R, g);
		c4.trace ("", R, g);
		d1.trace ("", R, g);
		d2.trace ("", R, g);
		d3.trace ("", R, g);
		d4.trace ("", R, g);

		g.setColor (Color.RED);
		A.trace ("A", R, g);
		B.trace ("B", R, g);
		C.trace ("C", R, g);
		D.trace ("D", R, g);
		P.trace ("P", R, g);

		g1.drawImage (img, 0, 0, this);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (P.deplace = P.zone (X, Y, R)) {
		} else 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)) {
		}
	}

	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		P.bouge (X, Y, R);
		A.bouge (X, Y, R);
		B.bouge (X, Y, R);
		C.bouge (X, Y, R);
		D.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		P.deplace = A.deplace = B.deplace = C.deplace = D.deplace = false;
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (P.zone (X, Y, R) || A.zone (X, Y, R) || B.zone (X, Y, R) || C.zone (X, Y, R) || D.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) {
		danois d = new danois ("danois");
		d.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		d.setSize (400, 400);
		d.setVisible (true);
	}

}
