import java.awt.*;
/**
 * Projet: PaintRevolution
 * <p>Title:UnCercle.java </p>
 * <p>Description:Classe qui instancie un objet de type UnCercle </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Societe: IUT NANCY CHARLEMAGNE II</p>
 * @author VIGNERON GEOFFROY && GANGANELLI DORIAN
 * @version 3.0
 */

public class UnCercle extends ConiqueCentree{

  /**
   * Constructeur de la classe qui initialise les points de construction de la figure.
   */
  public UnCercle(){
    super();
      this.tab_mem[0] = new UnPoint( (int)(Math.random()*600) , (int)(Math.random()*600) );
      UnPoint centre=this.tab_mem[0];
      int rayon=5+(int)(Math.random()*200);
      this.tab_mem[1]=new UnPoint(centre.rendreX()+rayon, centre.rendreY());
  }

  /**
   * Méthode permettant de récupérer le rayon du de la figure conique
   * @return double représentant la valeur du rayon
   */
  public double rendreRayon(){
    int dabs, dord ,absc , ord;
    double distance;
    dabs = tab_mem[0].rendreX();
    dord = tab_mem[0].rendreY();
    absc = tab_mem[1].rendreX();
    ord  = tab_mem[1].rendreY();
    distance = (dabs-absc)*(dabs-absc) + (dord-ord)*(dord-ord);
    distance = Math.sqrt(distance);
    return distance;
  }

  /**
   * Méthode qui permet de récupérer le nombre de point fondamentaux nécessaire pour construire
   * un cercle, c'est à dire le nombre de points de saisie.
   * @return un entier représentant ce nombre de point
   */
  public int nbPoints(){
    return 2;
  }
  /**
   * Méthode qui permet de dessiner et visualiser à l'écran la figure à construire
   * @param g environnement graphique associé
   */
  public void affiche(Graphics g){
    super.affiche(g);
    int diametre = 2*( (int)(this.rendreRayon()) ) ;
    int x = this.tab_mem[0].rendreX();
    int y = this.tab_mem[0].rendreY();
    g.fillOval( x - (int)rendreRayon() , y - (int)rendreRayon() , diametre , diametre);
  }

  /**
   * Méthode qui permet de modifier les points d'une figure
   * @param tab_saisie tableau contenant nouveau points
   */
  public void modifierPoints( UnPoint[] tab_saisie ){
    UnPoint centre = tab_saisie[0];
    double rayon = centre.distance( tab_saisie[1] );
    this.tab_mem[0] = centre;
    this.tab_mem[1] = new UnPoint( centre.rendreX()+(int)rayon , centre.rendreY());
      }


  /**
   * Méthode qui pemet de savoir si le point désigné par les coordonnées (x,y) de la souris
   * sont dans le cercle càd si la distance du point par rapport au centre est inférieure au rayon
   * @param x l'abscisse
   * @param y l'ordonnée
   * @return un booléen
   */
  public boolean contient(int x, int y) {
    double distance;
    double rayon=rendreRayon();
    UnPoint centre=this.tab_mem[0];
    UnPoint tmp = new UnPoint(x, y);
    distance = centre.distance(tmp);
    return ( distance <= rayon );
}


}