import PaD.*;
import java.awt.Color;

/**
 * Cette classe représente le plan cartésien et permet de visualiser à
 * l'aide de la planche à dessin (PaD) des points du plan
 *
 * @author V. Granet vg@unice.fr
 */

public class Plan2D {
    private static final double unité = 20;
    private final double milieuL;
    private final double milieuH;
    private PlancheADessin pad;

    /**
     * Rôle crée un Plan2D avec les axes gradués des abscisses et des ordonnées
     *
     */
    public Plan2D(int largeur, int hauteur) {
	this.pad = new PlancheADessin(largeur, hauteur, true);
	this.milieuL = largeur/2.0;
	this.milieuH = hauteur/2.0;
	this.tracerAxes();
	this.tracerGraduations();
    }

    /*
     * Rôle : convertit une coordonnée x du PaD en abscisse du Plan2D courant
     */
    private double coordX(double x) {
	return (unité*x)+milieuL;
    }

    /*
     * Rôle : convertit une coordonnée y du PaD en ordonnée du Plan2D courant
     */
    private double coordY(double y) {
	return -(unité*y)+milieuH;
    }

    /**
     * Rôle : renvoie la valeur minimale de l'axe des abscises
     */
    public double getMinAbcisse() {
	return -this.milieuL/this.unité;
    }

    /**
     * Rôle : renvoie la valeur maximale de l'axe des abscises
     */
    public double getMaxAbcisse() {
	return -this.getMinAbcisse();
    }

    /**
     * Rôle : renvoie la valeur minimale de l'axe des ordonnées
     */
    public double getMinOrdonnée() {
	return -this.milieuH/this.unité;
    }

    /**
     * Rôle : renvoie la valeur maximale de l'axe des ordonnées
     */
    public double getMaxOrdonnée() {
	return -this.getMinOrdonnée();
    }

    /*
     * Rôle : trace les axes des abscisses et des ordonnées du Plan2D courant
     */
    private void tracerAxes() {
	Dessinable abscisses = new Ligne(0, milieuH, pad.getLargeur(), milieuH, 2);
	Dessinable ordonnées = new Ligne(milieuL, 0, milieuL, pad.getHauteur(), 2);
	this.pad.ajouter(abscisses, ordonnées);
    }

    /*
     * Rôle : gradue les axes des abscisses et des ordonnées du Plan2D courant
     *
     */
    private void tracerGraduations() {
	// axes des abscisses
	for (double i=unité; i< pad.getLargeur(); i+=unité)
	    pad.ajouter(new Ligne(milieuL+i, milieuH+3,
				  milieuL+i, milieuH-4, 1));
	for (double i=unité; i<milieuL; i+=unité)
	    pad.ajouter(new Ligne(i, milieuH+3, i, milieuH-4, 1));
	// axes des ordonnées
	for (double i=unité; i<pad.getHauteur(); i+=unité)
	    pad.ajouter(new Ligne(milieuL-3, milieuH+i,
				  milieuL+3, milieuH+i, 1));
	for (double i=unité; i<milieuH; i+=unité)
	    pad.ajouter(new Ligne(milieuL-3, milieuH-i,
				  milieuL+3, milieuH-i, 1));
    }

    /**
     * Rôle : trace le Point (x,y) sur le Plan2D courant
     */
    public void tracerPoint(double x, double y) {
	this.pad.ajouter(new CerclePlein(coordX(x), coordY(y), 3,  PlancheADessin.GRIS_CLAIR));
    }
}
