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;
  }

Etienne.Duris[at]univ-mlv.fr - © École Nationale des Ponts et Chaussées - - http://www-igm.univ-mlv.fr/~duris/ENPC