import java.io.*;
import java.awt.*;
import java.lang.*;
import javax.swing.*;
import java.awt.geom.*;


/**
 *Classe Ellipse qui hérite de Forme.
 * 
 * @author Eynard Julien et DELCLAUX Florian 
 * @version Tp2 2_7_Application_Dessin
 */

public class Ellipse extends Forme
{
    // champs  (variables d'instance)
    /**Rayon 1 de l'ellipse*/
    protected float Diametre;

    /**Rayon 2 de l'ellipse*/
    protected float diametre;

    /**constante correspondant à la valeur de pi (=3.1416)*/
    final float pi= (float)Math.PI;

    /**
     * Constructeur par défaut pour des objets de type Ellipse.
     * Diametre 1 = 10
     * Diametre 2 = 5
     * @param s : Ellipse remplie ou non
     */
    protected Ellipse(boolean s)
        {
            // initialise les variables d'instance
            super(s);
            Diametre=10;
            diametre=5;
        }

     /**
     * Constructeur pour une position donnée pour des objets de type Ellipse.
     * Diametre 1 = 10
     * Diametre 2 = 5
     * @param x : Abscisse de l'Ellipse.
     * @param r : Ordonnée de l'Ellipse.
     * @param s : Ellipse remplie ou non.
     */
    protected Ellipse(float x, float y, boolean s)
        {
            // initialise les variables d'instance
            super(x,y,s);
            Diametre=10;
            diametre=5;
        }

     /**
     * Constructeur pour une position donnée et des dimension pour des objets de type Ellipse.
     * @param R : Valeur du premier Diametre.
     * @param r : Valeur du deuxième Diametre.
     * @param x : Absisse de l'Ellipse.
     * @param y : Ordonnée de l'Ellipse.
     * @param s : Ellipse remplie ou non.
     */
    protected Ellipse(float R, float r, float x, float y, boolean s)
        {
            // initialise les variables d'instance
            super(x,y,s);
            Diametre=R;//champ correspondant au premier rayon de l'ellipse
            diametre=r;//champ correspondant au second rayon de l'ellipse
        }

    /**
     *Redéfinition de la méthode aire() permettant de calculer l'aire de la classe ellipse et des sous classes.
     *@return : Le flottant correspondant à l'aire.
     */
    protected float aire()
         {
            return pi*Diametre*diametre/4;
         }

    /**
     *Redéfinition de la méthode perimetre() permettant de calculer le perimetre d'un objet Ellipse et de ses sous types.
     *@return : Le flottant correspondant à l'aire.
     */
    protected float perimetre()
         {
            return  2*pi*(float)Math.sqrt(0.5*((float)Math.pow(Diametre/2,2)+(float)Math.pow(diametre/2,2)));
         }

    /**
     * Redéfinition de la méthode toString pour une ellipse
     * @return : Une chaîne de caractère décrivant une ellipse découlant de forme et non spécifique à une ellipse pour ses sous classes.
     */
    public String toString()
        {
            String def = "aire = "+ aire() + "\n" + "perimetre = "+ perimetre()+ "\n"+super.toString();
            return def;
        }

    /**
     * Redéfinition de la méthode print() qui affiche les caractéristiques spécifiques à une ellipse.
     */
   protected void print()
        {
            System.out.println("Ellipse : \n" +"Diametre 1 = "+Diametre + "\nDiametre 2 = " +diametre +"\n" + toString());
        }

    /**
     * Redéfinition de la méthode redimension afin de redéfinir la taille des rayons de l'ellipse avec les même valeurs.
     * Ceci donne donc un cercle dans ce cas ci.
     * @param a : Valeur des nouveaux diametres de l'ellipse.
     */
    protected void redimension(float a)
        {
        /*on assigne la même valeur pour les 2 rayons*/
            Diametre = a;
            diametre = a;
        }

      /**
     * Redéfinition de la méthode redimension afin de redéfinir la taille des rayons de l'ellipse
     * @param a : Valeur du nouveau diametre 1.
     * @param b : Valeur du nouveau diametre 2.
     */
    protected void redimension2(float a, float b)// throws Exception
        {
            Diametre = a;//on assigne une nouvelle valeur au diametre 1
            diametre = b;//on assigne une nouvelle valeur au diametre 2
        }

    /**
     * Redéfinition de la méthode afficher afin d'afficher une ellipse
     *@param g : la fenêtre graphique spécifiée (ici l'applet)
     *@param c : la couleur à utiliser pour dessiner l'ellipse
     */
    protected void afficher(Graphics g, Color c)
        {
             Ellipse2D ellipse = new Ellipse2D.Double(x,y,Diametre,diametre);//on créer l'Ellipse à afficher       
             Graphics2D g2 = (Graphics2D)g;//on converti g en type 2D pour pouvoir créer une Ellipse2D
             g.setColor(c);//on va utilisé la couleur de l'ellipse pour la dessiner
             if (style== false)
                  g2.draw(ellipse);//on crée une éllipse vide
             else
                  g2.fill(ellipse);//on crée une ellipse pleine
        }
}