234 lines
5.1 KiB
Java
234 lines
5.1 KiB
Java
|
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));
|
|||
|
}
|
|||
|
|
|||
|
}
|