/**
 * classe Polygone
 *
 * Modélise un polygone avec la liste de ses sommets et son nom
 *
 * @author Matthias Colin
 *
 * @version 1.1 (31/03/2010)
 */
public class Polygone {

	// les sommets du Polygone
	private Point[] sommets;
	// nom du polygone
	private String nom;

	/**
	 * constructeur de la classe Polygone
	 * @param sommets : les points formant les sommets du Polygone
	 * NB : le type Point... est assimilé au type Point[] dans son
	 * traitement
	 */
	public Polygone(String nom, Point... sommets) {
		// TODO : vérifier que sommets.length > 2
		// (voir exceptions)
		this.nom = nom;
		this.sommets = sommets;
	}
	
	/**
	 * obtenir le nombre de sommets du Polygone
	 * @return : le nombre de sommets
	 */
	public int getNombreSommets() {
		return sommets.length;
	}

	/**
	 * obtenir un sommet du Polygone à partir de son index
	 * les sommets sont numérotés de 1 à n
	 * @param index : numéro du sommet à renvoyer
	 */
	public Point getSommet(int index) {
		if ((index > 0) || (index <= sommets.length)) {
			return sommets[index - 1];
		} else {
			return null;
		}
	}
	
	/**
	 * translater la figure
	 * @param deplacementHorizontal : partie horizontale du vecteur de déplacement
	 * @param deplacementVertical : partie verticale du vecteur de déplacement
	 */
	 public void translater(
			int deplacementHorizontal,
			int deplacementVertical) 
	{
		// pour déplacer le polygone, on déplace tous ses sommets
		for (Point sommet : sommets) {
			sommet.translater(deplacementHorizontal, deplacementVertical);
		}
	}

	/**
	 * obtenir le périmètre de la figure
	 * @return le périmètre
	 */
	public double perimetre() {
		double perimetreCalcule; // périmètre calcul
		perimetreCalcule = 0.0;
		// on additionne les distances entre les sommets i et i+1 pour
		// les n-1 premiers sommets
		for (int i = 1; i < this.getNombreSommets(); i++) {
			perimetreCalcule += this.getSommet(i).distance(this.getSommet(i+1));
		}
		// on ajoute la distance du dernier sommet au 1er
		perimetreCalcule += this.getSommet(this.getNombreSommets()).distance(
				this.getSommet(1));
		return perimetreCalcule;
	}
	
	/**
	 * obtenir la surface de la figure
 	 * (uniquement pour un polygone convexe)
	 * @return la surface du polygone
 	 */ 
	public double surface() {
		// surface du triangle composé des 3 premiers sommets
		Triangle t = new Triangle("_tmp_", sommets[0], sommets[1], sommets[2]);
		double surfaceTotale = t.surface();
		// si plus de 3 sommets, appel récursif
		if (sommets.length > 3) {
			// on recopie les sommets du polygone sauf le 2e (n°1)
			Point[] sommetsPolygoneMoins1 = java.util.Arrays.copyOfRange(
					sommets, 1, sommets.length);
			sommetsPolygoneMoins1[0] = sommets[0];
			// on ajoute la surface du polygone de n-1 sommets
			Polygone polygoneMoins1 = new Polygone("_tmp_", sommetsPolygoneMoins1);
			surfaceTotale += polygoneMoins1.surface();
			// NB : dans le cas d'un polygone convexe (sommets n°1 
			// l'intérieur), il faut retrancher la surface du triangle
		}
		return surfaceTotale;
	}
	
	/**
	 * représentation de la figure en chaîne de caractères
 	 * Format : Poly|point1|...|pointn|
 	 */ 
	public String toString() {
		String polygoneTexte;
		polygoneTexte = nom + "|";
		for (Point sommet : sommets) {
			polygoneTexte += sommet + "|";
		}
		return polygoneTexte;
	}
	
}

