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.0, 0.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 (!(o instanceof Point)) {
206 return false;
207 }
208
209 return (this.x == ((Point) o).x) && (this.y == ((Point) o).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 }
|