projet-mini-programmation-o.../Cercle.java
2023-06-20 21:03:42 +02:00

234 lines
5.1 KiB
Java
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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