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