001 package fr.isae.geometry.more;
002
003 import fr.isae.observer.Observateur;
004
005 /**
006 * <code>Segment</code> est une classe permettant de modeliser un
007 * segment geometrique. Ce segment est compose de deux points et on
008 * peut recuperer sa longueur et le translater.
009 *
010 * @author <a href="mailto:garion@isae.fr">Christophe Garion</a>
011 * @version 1.0
012 */
013 public class Segment {
014
015 private Point extremite1;
016 private Point extremite2;
017 private double longueur;
018 private MajLongueurSegment majLongueurSegment;
019
020 /**
021 * Cree une nouvelle instance de <code>Segment</code>. Attention,
022 * les points passes en parametre sont affectes directement aux
023 * attributs de l'objet a creer.
024 *
025 * <p> On aurait pu egalement creer de nouveaux points a partir des
026 * points passes en parametre.
027 *
028 * @param p1 un <code>Point</code> representant la premiere extremite
029 * du segment
030 * @param p2 un <code>Point</code> representant la seconde extremite
031 * du segment
032 */
033 public Segment(Point p1, Point p2) {
034 this.majLongueurSegment = new MajLongueurSegment();
035 this.extremite1 = p1;
036 p1.inscrire(this.majLongueurSegment);
037 this.extremite2 = p2;
038 p2.inscrire(this.majLongueurSegment);
039 this.longueur = p1.distance(p2);
040 }
041
042 /**
043 * <code>getExtremite1</code> retourne le point correspondant a
044 * la premiere extremite du segment.
045 *
046 * @return le <code>Point</code> qui est la premiere extremite
047 */
048 public Point getExtremite1() {
049 return this.extremite1;
050 }
051
052 /**
053 * <code>getExtremite2</code> retourne le point correspondant a
054 * la seconde extremite du segment.
055 *
056 * @return le <code>Point</code> qui est la seconde extremite
057 */
058 public Point getExtremite2() {
059 return this.extremite2;
060 }
061
062 /**
063 * <code>getLongueur</code> renvoie la longueur du segment.
064 *
065 * @return un <code>double</code> qui est la longueur du segment
066 */
067 public double getLongueur() {
068 return this.longueur;
069 }
070
071 /**
072 * <code>translater</code> permet de translater le segment.
073 *
074 * @param dx l'abscisse du vecteur de translation
075 * @param dy l'ordonnee du vecteur de translation
076 */
077 public void translater(double dx, double dy) {
078 this.extremite1.translater(dx, dy);
079 this.extremite2.translater(dx, dy);
080 }
081
082 /**
083 * <code>afficher</code> permet d'afficher le segment.
084 */
085 public void afficher() {
086 System.out.println(this);
087 }
088
089 /**
090 * <code>toString</code> renvoie une chaine de caracteres (un
091 * objet de type <code>String</code>) representant le segment.
092 *
093 * @return un objet de type <code>String</code> representant
094 * le segment. Pour un segment compose des deux points
095 * <code>(1,0)</code> et <code>(2,3)</code>, cet objet
096 * representera la chaine <code>[(1,0);(2,3)]</code>
097 */
098 @Override public String toString() {
099 return ("[" + this.extremite1 + ";" + this.extremite2 + "]");
100 }
101
102 private class MajLongueurSegment extends Observateur {
103
104 @Override public void miseAJour() {
105 longueur = extremite1.distance(extremite2);
106 }
107 }
108 }
|