Segment.java
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 }