/**
 * testgeo7.java	22/09/22
 * auteur : Jean-Paul Quelen
 */

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import geo.*;

public class testgeo7 extends JFrame implements MouseListener, MouseMotionListener {
	static final long serialVersionUID = 220922L;
	int w, h;
	static Image img;
	static Graphics g1;
	static Repere R;
	static PointLibre O;
	static PointSurDroite U;
	static Droite OU;
	static CourbeFonction2 cf1;
	static CourbeFonction2 cf2;
	static CourbePolaire cp;

	public testgeo7 (String titre) {
		super (titre);
		setFont (new Font ("Arial", Font.PLAIN, 12));
		addMouseMotionListener (this);
		addMouseListener (this);
	}

	public void update (Graphics g) {
		paint (g);
	}

	public void paint (Graphics g) {
		int w1 = getWidth();
		int h1 = getHeight();
		if ((img == null) || (w1 != w) || (h1 != h)) {
			w = w1;
			h = h1;
			img = createImage (w, h);
			g1 = img.getGraphics();
			if (R == null) {
				R = new Repere (w / 2, h / 2, w, h, 100.0, 100.0);
				O = new PointLibre (0.0, 0.0);
				OU = new Droite (0.0, 1.0, 0.0);					// axe des x
				U = new PointSurDroite (1.0, 0.0, OU);
				cf1 = new CourbeFonction2 (new Poisson(), 0.0, 6.3, 0.1);
				cf2 = new CourbeFonction2 (new Lissajous(), 0.0, 6.3, 0.1);
				cp = new CourbePolaire (new Rosace(), 0.0, 6.3, 0.02);
			}
		}

		R.MAJ (R.X (O.x), R.Y (O.y), w, h, R.unitex, R.unitex);
		O.MAJ (0.0, 0.0);
		if (U.deplace && (U.x > 0)) {
			R.unitex = R.unitey = O.distance (U) * R.unitex;
		}
		U.MAJ (1.0, 0.0);

		g1.setColor (Color.WHITE);
		g1.fillRect (0, 0, R.XMAX, R.YMAX);

		g1.setColor (Color.GREEN);
		R.trace (g1);

		g1.setColor (Color.BLUE);
		cf1.trace ("Poisson", R, g1);

		g1.setColor (Color.BLACK);
		cf2.trace ("Lissajous", R, g1);

		g1.setColor (Color.MAGENTA);
		cp.trace ("Rosace", R, g1);

		g1.setColor (Color.RED);
		O.trace ("O", R, g1);
		U.trace ("U", R, g1);
		
		g.drawImage (img, 0, 0, this);
	}

	public void mousePressed (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		if ((U.deplace = U.zone (X, Y, R)) || (O.deplace = O.zone (X, Y, R))) {}
	}

	public void mouseDragged (MouseEvent e) {
		int X = e.getX();
		int Y =  e.getY();
		U.bouge (X, Y, R);
		O.bouge (X, Y, R);
		repaint();
	}

	public void mouseReleased (MouseEvent e) {
		U.deplace = O.deplace = false;
	}

	public void mouseMoved (MouseEvent e) {
		int X = e.getX();
		int Y = e.getY();
		if (U.zone (X, Y, R) || O.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[]) {
		testgeo7 appl = new testgeo7 ("testgeo");
		appl.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		appl.setSize (800, 600);
		appl.setVisible (true);
	}


/**
 * fonction Poisson sur [0, 2pi[
 */

protected class Poisson extends Fonction2 {
	static double rac8 = 2.0 * Math.sqrt (2.0);

	public boolean defini (double t) {
		return true;
	}

	public double[] Image (double t) {
		double[] d = new double [2];
		d [0] = Math.cos (2.0 * t) + rac8 * Math.cos (t);
		d [1] = Math.sin (2.0 * t);
		return d;
	}
}

/**
 * fonction Lissajous sur [0, 2pi[
 */

protected class Lissajous extends Fonction2 {
	int p = 2;
	int q = 3;

	public boolean defini (double t) {
		return true;
	}

	public double[] Image (double t) {
		double[] d = new double [2];
		double phi = 0.0;

		d [0] = Math.sin (p * t);
		d [1] = Math.sin (q * t + phi);
		return d;
	}
}

/**
 * fonction Rosace sur [0, 2pi[
 */

protected class Rosace extends Fonction {
	int n = 4;
	double phi = 0.0;

	public boolean defini (double t) {
		return true;
	}

	public double Image (double t) {
		return Math.sin (n * t);
	}
}

}
