import java.awt.Color; /** * Cercle modélise un cercle géométrique dans un plan équipé d'un * repère cartésien. Un cercle peut être affiché et translaté. */ public class Cercle implements Mesurable2D { //@ public invariant getRayon() > 0; //@ public invariant getDiametre() > 0; //@ private invariant rayon == getRayon(); //@ private invariant 2*rayon == getDiametre(); //@ private invariant couleur == getCouleur(); //@ private invariant centre.getX() == getCentre().getX(); //@ private invariant centre.getY() == getCentre().getY(); // Constantes /** constante mathématique π. */ public static final double PI = Math.PI; // Attributs /** centre du cercle. */ private Point centre; /** rayon du cercle. */ private double rayon; /** couleur du cercle. */ private Color couleur = Color.BLUE; // Constructeurs /** * Construire un cercle à partir de son centre et de son rayon. * @param centre centre du cercle * @param rayon rayon du cercle */ //@ requires centre != null; //@ requires rayon > 0; public Cercle(Point centre, double rayon) { assert centre != null; assert rayon > 0; this.centre = new Point(centre.getX(), centre.getY()); this.rayon = rayon; } /** * Construire un cercle à partir de deux points diamétralement opposés. * @param p1 point n°1 * @param p2 point n°2 */ //@ requires p1 != null; //@ requires p2 != null; //@ requires p1.getX() != p2.getX() && p1.getY() != p2.getY(); //@ ensures getRayon() > 0; public Cercle(Point p1, Point p2) { assert p1 != null; assert p2 != null; assert p1.getX() != p2.getX() || p1.getY() != p2.getY(); this.centre = new Point((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2); this.rayon = p1.distance(p2) / 2; } /** * Construire un cercle coloré à partir de deux points diamétralement opposés. * @param p1 point n°1 * @param p2 point n°2 * @param couleur couleur du cercle */ //@ requires couleur != null; public Cercle(Point p1, Point p2, Color couleur) { this(p1, p2); assert couleur != null; this.couleur = couleur; } // GETs /** * Obtenir le rayon du cercle. * @return rayon du cercle */ //@ ensures \result > 0; public /*@ pure @*/ double getRayon() { return this.rayon; } /** * Obtenir le diamètre du cercle. * @return diamètre du cercle */ //@ ensures \result > 0; public /*@ pure @*/ double getDiametre() { return 2 * this.rayon; } /** * Obtenir le centre du cercle. * @return centre du cercle */ public /*@ pure @*/ Point getCentre() { return new Point(this.centre.getX(), this.centre.getY()); } /** * Obtenir la couleur du cercle. * @return couleur du cercle */ public /*@ pure @*/ Color getCouleur() { return this.couleur; } // SETs /** * Changer le rayon du cercle. * @param rayon nouveau rayon */ //@ requires rayon > 0; //@ ensures getRayon() == rayon public void setRayon(double rayon) { assert rayon > 0; this.rayon = rayon; } /** * Changer le diamètre du cercle. * @param d nouveau diamètre */ //@ requires d > 0; //@ ensures getDiametre() == d public void setDiametre(double d) { assert d > 0; this.rayon = d / 2; } /** * Changer le centre du cercle. * @param centre nouveau centre */ //@ requires centre != null; public void setCentre(Point centre) { assert centre != null; this.centre = centre; } /** * Changer la couleur du cercle. * @param nouvelleCouleur nouvelle couleur */ //@ requires nouvelleCouleur != null; public void setCouleur(Color nouvelleCouleur) { assert nouvelleCouleur != null; this.couleur = nouvelleCouleur; } // Prints /** * Convertir le Cercle en un String pour son affichage. * @return String associée au Cercle */ public String toString() { return "C" + this.rayon + "@" + this.centre; } /** * Afficher le cercle. */ public void afficher() { System.out.print(this); } // Méthodes /** * Translater le cercle. * @param dx déplacement suivant l'axe des X * @param dy déplacement suivant l'axe des Y */ public void translater(double dx, double dy) { this.centre.translater(dx, dy); } /** * Vérifier si un point est à l'intérieur du cercle. * @param p point que l'on souhaite tester * @return true si p ∈ 𝒞 */ //@ requires p != null; public boolean contient(Point p) { assert p != null; return p.distance(this.centre) <= this.rayon; } /** * Renvoie le périmètre du cercle. * @return perimètre du cercle */ public double perimetre() { return 2 * PI * this.rayon; } /** * Renvoie l'aire du cercle. * @return aire du cercle */ public double aire() { return PI * this.rayon * this.rayon; } // Méthodes de classe /** * Renvoie un Cercle créé à partir du centre et d'un point du cercle. * @param centre centre du Cercle * @param circ Point situé sur le cercle * @return objet Cercle */ //@ requires centre != null; //@ requires circ != null; public static Cercle creerCercle(Point centre, Point circ) { assert centre != null; assert circ != null; return new Cercle(centre, centre.distance(circ)); } }