/**
 *  Rectangles a cotés parallèles aux axes de coordonnées. Un rectangle est represente par deux points : son coin supérieur
 *  gauche et son coin inférieur droit. Les instances de cette classe sont non modifiables.
 *
 * @author     Lotfi Bennacer
 * @author     Marc Champesme
 * @version    16 mai 2002
 * @version    30 avril 2003
 * @version    11 mars 2004
 */
public class Rectangle {
	private Point[] sommets;


	/**
	 *  Construit un rectangle a partir de son coin supérieur gauche et de son coin
	 *  inéfrieur droit.
	 *
	 * @param  coinSupGauche  coin supérieur gauche
	 * @param  coinInfDroit   coin inférieur droit
	 */
	public Rectangle(Point coinSupGauche, Point coinInfDroit) {
		sommets = new Point[4];
		sommets[0] = coinSupGauche;
		sommets[1] = new Point(coinInfDroit.getX(), coinSupGauche.getY());
		sommets[2] = coinInfDroit;
		sommets[3] = new Point(coinSupGauche.getX(), coinInfDroit.getY());
	}


	/**
	 *  Renvoie le coin supérieur gauche du rectangle, qui est en meme temps
	 le sommet de rang 0.
	 *
	 * @return    Le coin supérieur gauche du rectangle
	 */
	public Point getCoinSupGauche() {
		return sommets[0];
	}


	/**
	 *  Renvoie le coin inférieur droit du rectangle, qui est en meme temps
	 le sommet de rang 2.
	 *
	 * @return    Le coin inférieur droit du rectangle
	 */
	public Point getCoinInfDroit() {
		return sommets[2];
	}


	/**
	 *  Renvoie le sommet de rang <code>numSommet</code> de ce rectangle.
	 *
	 * @param  numSommet  rang du sommet
	 * @return            un point de meme coordonnées que le sommet du rectangle
	 de rang <code>numSommet</code>.
	 */
	public Point getSommet(int numSommet) {
		return sommets[numSommet];
	}


	/**
	 *  Description of the Method
	 *
	 * @return    Description of the Return Value
	 */
	public double surface() {
		double lgCoteHorizontal;
		double lgCoteVertical;

		lgCoteHorizontal = sommets[0].distanceA(sommets[1]);
		lgCoteVertical = sommets[1].distanceA(sommets[2]);

		return lgCoteHorizontal * lgCoteVertical;
	}


	/**
	 *  Calcule le perimetre de ce rectangle
	 *
	 * @return    le perimetre de ce rectangle
	 */
	public double perimetre() {
		double lgCoteHorizontal;
		double lgCoteVertical;

		lgCoteHorizontal = sommets[0].distanceA(sommets[1]);
		lgCoteVertical = sommets[1].distanceA(sommets[2]);

		return 2 * (lgCoteHorizontal + lgCoteVertical);
	}


	/**
	 *  Construit un nouveau rectangle en prenant le symetrique de cette instance
	 par rapport a l'axe des ordonnées.
	 *
	 * @return    un rectangle symétrique de l'instance courante.
	 */
	public Rectangle symetrie() {
		return new Rectangle(sommets[1].symetrie(), sommets[3].symetrie());
	}
}


