Point.java
001 package fr.isae.geometry.api;
002 
003 import java.util.Observable;
004 
005 /**
006  <code>Point</code> definit une classe point mathematique dans un
007  * plan qui peut est dans un repere cartesien.<BR>
008  * Un point peut etre translate. Sa distance par rapport a un autre
009  * point peut etre obtenue.
010  *
011  @author <a href="mailto:garion@isae.fr">Christophe Garion</a>
012  @version 1.0
013  */
014 public class Point extends Observable {
015     private double x;
016     private double y;
017 
018     /**
019      * La valeur servant a comparer des <code>double</code> entre eux.
020      */
021     public static final double EPS = 10E-9;
022 
023     /**
024      * Une constante representant le point a l'origine.
025      */
026     public static final Point ORIGINE = new Point(0.00.0);
027 
028     /**
029      * Cree une nouvelle instance de <code>Point</code>.
030      *
031      @param x un <code>double</code> representant l'abscisse du
032      *          point a creer
033      @param y un <code>double</code> representant l'ordonnee du
034      *          point a creer
035      */
036     public Point(double x, double y) {
037         super();
038         this.x = x;
039         this.y = y;
040     }
041 
042     /**
043      * La valeur de l'abscisse du point.
044      *
045      @return un <code>double</code>  qui est l'abscisse du point
046      */
047     public double getX() {
048         return this.x;
049     }
050 
051     /**
052      * Changer la valeur de l'abscisse du point.
053      *
054      @param x un <code>double</code> qui est la nouvelle abscisse
055      */
056     public void setX(double x) {
057         double[] coordTranslation = {x - this.x, 0.0};
058         this.x = x;
059         this.setChanged();
060         this.notifyObservers(coordTranslation);
061     }
062 
063     /**
064      * La valeur de l'ordonnee du point.
065      *
066      @return un <code>double</code> qui est l'ordonnee du point
067      */
068     public double getY() {
069         return this.y;
070     }
071 
072     /**
073      * Changer la valeur de l'ordonnee du point.
074      *
075      @param y un <code>double</code> qui est la nouvelle ordonnee
076      */
077     public void setY(double y) {
078         double[] coordTranslation = {0.0, y - this.y};
079         this.y = y;
080         this.setChanged();
081         this.notifyObservers(coordTranslation);
082     }
083 
084     /**
085      * La valeur du module du point.
086      *
087      @return un <code>double</code> qui est la valeur du module.
088      */
089     public double getModule() {
090         return (Math.sqrt(this.x * this.x + this.y * this.y));
091     }
092 
093     /**
094      * Changer la valeur du module du point.
095      *
096      @param module la nouvelle valeur du module du point. <b>Elle
097      *               doit etre positive.</b>
098      */
099     public void setModule(double module) {
100         double ancienModule = getModule();
101 
102         if (ancienModule < EPS) {
103             this.x = module;
104         else {
105             this.x = (this.x * module/ ancienModule;
106             this.y = (this.y * module/  ancienModule;
107         }
108     }
109 
110     /**
111      * La valeur de l'argument du point.
112      *
113      @return un <code>double</code> qui est la valeur de l'argument.
114      */
115     public double getArgument() {
116         if (this.getModule() < EPS) {
117             return 0;
118         }
119 
120         double ancienArg = Math.acos(this.x / this.getModule());
121 
122         if (this.y < 0) {
123             return (-1.0 * ancienArg);
124         }
125 
126         return ancienArg;
127     }
128 
129     /**
130      * Changer la valeur de l'argument du point.
131      *
132      @param argument la nouvelle valeur de l'argument du point.
133      */
134     public void setArgument(double argument) {
135         double ancienModule = this.getModule();
136         x = ancienModule * Math.cos(argument);
137         y = ancienModule * Math.sin(argument);
138     }
139 
140     /**
141      <code>translater</code> permet de translater le point.
142      *
143      @param dx un <code>double</code> qui represente l'abscisse du
144      *           vecteur de translation
145      @param dy un <code>double</code> qui represente l'ordonnee du
146      *           vecteur de translation
147      */
148     public void translater(double dx, double dy) {
149         this.x = this.x + dx;
150         this.y = this.y + dy;
151         double[] coordTranslation = {dx, dy};
152         this.setChanged();
153         this.notifyObservers(coordTranslation);
154     }
155 
156     /**
157      <code>afficher</code> permet d'afficher les coordonnees du point.
158      */
159     public void afficher() {
160         System.out.println(this);
161     }
162 
163     /**
164      <code>toString</code> renvoie un objet de type <code>String</code>
165      * qui represente une chaine de caracteres representant le point.
166      *
167      <p> Nous verrons plus tard (cf. cours sur l'heritage) que
168      * cette methode nous permet d'utiliser un objet comme un type
169      * primitif et d'ecrire par exemple <code>System.out.println("Le
170      * point est : " + p)</code> ou <code>p</code> est une poignee
171      * sur un objet de type <code>Point</code>.
172      *
173      @return un objet de type <code>String</code> representant
174      *         le point. Pour un point de coordonnees (2,3), cet objet
175      *         representera la chaine <code>(2,3)</code>.
176      */
177     public String toString() {
178         return ("(" this.x + "," this.y + ")");
179     }
180 
181     /**
182      <code>distance</code> permet de calculer la distance entre deux
183      * points.
184      *
185      @param p un <code>Point</code> qui est l'autre point pour calculer
186      *          la distance
187      @return un <code>double</code> qui est la distance entre les deux
188      *         point
189      */
190     public double distance(Point p) {
191         return (Math.sqrt(((this.x - p.x(this.x - p.x)) +
192                           ((this.y - p.y(this.y - p.y))));
193     }
194 
195     /**
196      <code>equals</code> permet de verifier si deux points sont egaux, i.e.
197      * s'ils ont les memes coordonnees.
198      *
199      @param o un <code>Object</code> qui est l'objet dont on veut verifier s'il
200      *          est egal a <code>this</code>
201      @return un <code>boolean</code> qui est <code>true</code> si <code>o</code>
202      *         est un point egal a <code>this</code>
203      */
204     @Override public boolean equals(Object o) {
205         if (!(instanceof Point)) {
206             return false;
207         }
208 
209         return (this.x == ((Pointo).x&& (this.y == ((Pointo).y);
210     }
211 
212     /**
213      <code>clone</code> permet d'obtenir une copie de <code>this</code>. On obtient
214      * un nouveau point avec des coordonnees identiques.
215      *
216      @return un <code>Point p</code> tel que <code>this != p</code> et
217      *         <code>this.equals(p)</code>
218      */
219     public Point clone() {
220         return new Point(this.x, this.y);
221     }
222 }