/**
  *
  * Programmieraufgabe P-15 (geometrie.jar)
  *
  * @author Leonhard Fellermayr
  * @version 1.0
  *
  */

/** Zugehšrigkeit zum Package geometrie */

package geometrie;

/** In der Methode zeichnen() wird der Kreis als Instanz von Ellipse2D in den AWT-Grafikkontext gezeichnet. */

import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

/** Implementierung der Klasse Kreis - implementiert die Methoden der abstrakten Klasse Figur */

public class Kreis extends Figur
{

	/** Der Kreis wird eindeutig festgelegt durch einen Mittelpunkt p und einen Radius r. */

	private Punkt p;
	private double r;

	/**
	  * verschieben (dx, dy): Verschiebt den Mittelpunkt um den Vektor (dx, dy).
	  *
	  * Dies reicht aus, um den gesamten Kreis zu verschieben.
	  *
	  * @param dx Verschiebung in x-Richtung
	  * @param dy Verschiebung in y-Richtung
	  * @return void
	  *
	  */

	public void verschieben (double dx, double dy)
	{

		this.p.verschieben (dx, dy);

	} // verschieben ()

	/**
	  * strecken (zentrum, faktor): Wendet auf den Mittelpunkt des Kreises
	  * eine zentrische Streckung um das Zentrum zentrum mit dem Faktor
	  * faktor an.
	  *
	  * Dies reicht aus, um den gesamten Kreis zentrisch zu strecken.
	  *
	  * @param zentrum Punkt, der das Streckungszentrum darstellt
	  * @param faktor Streckungsfaktor (double)
	  * @return void
	  *
	  */

	public void strecken (Punkt zentrum, double faktor)
	{

		this.p.strecken (zentrum, faktor);

	} // strecken ()

	/**
	  * rotieren (zentrum, winkel): Rotiert den Mittelpunkt des Kreises
	  * um zentrum mit dem Drehwinkel winkel.
	  *
	  * Dies reicht aus, um den gesamten Kreis zu drehen.
	  *
	  * @param zentrum Punkt, um den der Kreis gedreht wird
	  * @param winkel Drehwinkel als Vielfaches von Math.PI (Bogenlaenge, RAD)
	  * @return void
	  *
	  */

	public void rotieren (Punkt zentrum, double winkel)
	{

		this.p.rotieren (zentrum, winkel);

	} // rotieren ()

	/**
	  * zeichnen (g2): Zeichnet das Objekt in den Ÿbergebenen AWT-Grafikkontext.
	  *
	  * @param g2 Grafikkontext, Instanz von Graphics2D
	  * @return void
	  *
	  */

	public void zeichnen (Graphics2D g2)
	{

		/** Zeichne Kreis als Ellipse mit zwei identischen Radien.
		  * Beachte dabei, dass Ellipse2D in den ersten beiden Parametern
		  * die Koordinaten der linken oberen Ecke (o) der Bounding Box
		  * erwartet, nicht die des Kreismittelpunkts.
		  *
		  * Diese errechnen sich aus den Koordinaten des Mittelpunkts p
		  * abzŸglich (komponentenweise) dem Radius r.
		  *
		  *    o_______
		  *    |  xx  |
		  *    | x  x |
		  *    |x    x|
		  *    | x  x |
		  *    |__xx__|
		  */

		g2.draw (new Ellipse2D.Double (p.getX() - r, p.getY() - r, 2*r, 2*r));

	} // zeichnen ()


	/**
	  * Kreis (p, r): Konstruktor der Klasse Kreis.
	  *
	  * Legt in den Instanzvariablen p, r geklonte Kopien der beim
	  * Konstruktoraufruf Ÿbergebenen Parameter p, r an.
	  *
	  * Dieses Vorgehen ist unbedingt erforderlich, da diese Methode die an den
	  * Konstruktor Ÿbergebenen Parameter keinesfalls verŠndern darf.
	  * Dies wŸrde weitreichende Seiteneffekte in der Art des
	  * SimpTest-Screenshots hervorrufen.
	  *
	  * @param p Mittelpunkt p des Kreises (Punkt)
	  * @param r Radius des Kreises (double)
	  *
	  */

	public Kreis (Punkt p, double r)
	{

		this.p = (Punkt)p.clone ();
		this.r = r;

	} // Konstruktor

} // Klasse Kreis