ENPC - Programmation -
Corrections 3
La classe Disque
public class Disque {
private Point centre;
private double rayon;
/**
* Construit un disque à partir du centre et du rayon passés en arguments.
*/
public Disque(Point centre, double rayon) {
this.centre = centre;
this.rayon = rayon;
}
/**
* Construit un disque dont le centre est un Point par défaut et
* dont le rayon est 1.
*/
public Disque() {
this.centre = new Point();
this.rayon = 1;
}
/**
* Donne la représentation d'un disque sous la forme:
* Disque - centre: (x,y) rayon: r.
*/
public String toString() {
// La représentation du centre est de la responsabilité de la classe Point
// Il est donc important de lui "déléguer" cette tâche en appelant la méthode
// toString() sur l'objet centre.
return "Disque - centre: " + centre.toString() + " rayon: " + rayon;
}
/**
* Déplace le disque de dx en abscisse et de dy en ordonnée.
*/
public void translate(double dx, double dy) {
// Pour déplacer le disque, il suffit de déplacer son centre.
centre.translate(dx,dy);
}
/**
* Retourne la surface du disque.
*/
public double surface() {
// On utilise la constante (final static) PI de la classe java.lang.Math
return Math.PI * rayon * rayon;
}
/**
* Retourne vrai si les deux disques ont des centres de mêmes
* coordonnées et un même rayon.
* On délègue le test d'égalité des centres à la classe Point.
*/
public boolean same(Disque d) {
return ((centre.same(d.centre)) && (rayon == d.rayon) );
}
public static void main(String[] args) {
Point p = new Point(3.4, 5.7);
Disque d = new Disque(p,4);
System.out.println(d.toString());
System.out.println("Surface du disque : " + d.surface());
d.translate(1.6, -0.7);
System.out.println("Après translation : " + d.toString());
Disque d2 = new Disque(p,4);
// Attention: réfléchissez à quel est l'état de p ici...
System.out.println(d == d2); // affiche false
System.out.println(d.same(d2)); // affiche true
}
}
La méthode isIn()
Il est préférable de commencer par écrire dans la classe Point
une méthode distance() qui calcule la distance entre deux points:
public class Point {
...
/**
* Retourne la distance entre ce point et p.
*/
public double distance(Point p) {
return Math.sqrt((x - p.x)*(x - p.x) + (y - p.y)*(y - p.y));
}
...
}
Ensuite, il est plus facile d'écrire la méthode isIn() dans
la classe Disque:
public class Disque {
...
/**
* Retourne vrai si p est dans le disque et faux sinon.
*/
public boolean isIn(Point p) {
return (centre.distance(p) <= rayon);
}
...
}
La méthode howManyIn()
/**
* Retourne le nombre de points du tableau tab qui sont dans le disque.
*/
public int howManyIn(Point[] tab) {
int total = 0;
for(int i = 0; i<tab.length; i++) {
if (isIn(tab[i]))
total++;
}
return total;
}