/**
  *
  * Programmieraufgabe P-16 (geometrie2.jar)
  *
  * @author Leonhard Fellermayr
  * @version 1.0
  *
  */

/** Zugehšrigkeit zum Package geometrie */

package geometrie;

/** In der Methode zeichnen () wird der Punkt durch eine Linie (drawLine()) der LŠnge 1 realisiert. */

import java.awt.Graphics2D;

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

public class Punkt extends Figur
{

	/** Ein Punkt ist eindeutig bestimmt durch seine x- und y-Koordinate. */

	private double x, y;

	/**
	  * getX () : Gibt die x-Koordinate des Punktes zurŸck.
	  *
	  * @return x-Koordinate des Punktes
	  *
	  */

	public double getX ()
	{

		return (x);

	} // getX ()

	/**
	  * getY () : Gibt die y-Koordinate des Punktes zurŸck.
	  *
	  * @return y-Koordinate des Punktes
	  *
	  */

	public double getY ()
	{

		return (y);

	} // getY ()

	/**
	  * verschieben (dx, dy): Verschiebt den Punkt um den Vektor (dx, dy),
	  * indem der Offset dx zu x, und der Offset dy zu y addiert werden.
	  *
	  * Dadurch wird der Punkt um (dx, dy) verschoben.
	  *
	  * @param dx Verschiebung in x-Richtung
	  * @param dy Verschiebung in y-Richtung
	  * @return void
	  *
	  */

	public void verschieben (double dx, double dy)
	{

		this.x += dx;
		this.y += dy;

	} // verschieben ()

	/**
	  * strecken (zentrum, faktor): FŸhrt eine zentrische Streckung
	  * des Punkts um das Zentrum zentrum mit dem Faktor faktor durch.
	  *
	  * Dadurch wird der Punkt zentrisch gestreckt.
	  *
	  * Mathematisch ausgedrŸckt erfolgt die zentrische Streckung
	  * durch Matrizenmultiplikation von links (s. Aufgabenblatt 6).
	  *
	  * @param zentrum Punkt, der das Streckungszentrum reprŠsentiert
	  * @param faktor Streckungsfaktor (double)
	  * @return void
	  *
	  */

	public void strecken (Punkt zentrum, double faktor)
	{

		this.x = faktor * this.x + (1 - faktor) * zentrum.x;
		this.y = faktor * this.y + (1 - faktor) * zentrum.y;

	} // strecken ()

	/**
	  * rotieren (zentrum, winkel): Rotiert den Punkt um das Zentrum
	  * zentrum mit dem Drehwinkel winkel.
	  *
	  * Dadurch wird der Punkt um winkel Grad um das zentrum gedreht.
	  *
	  * Mathematisch ausgedrŸckt erfolgt die Drehung (Rotation)
	  * durch Matrizenmultiplikation von links (s. Aufgabenblatt 6).
	  *
	  * @param zentrum Punkt, um den das Dreieck gedreht wird
	  * @param winkel Drehwinkel als Vielfaches von Math.PI (Bogenlaenge, RAD)
	  * @return void
	  *
	  */

	public void rotieren (Punkt zentrum, double winkel)
	{

		/** Verwende temporŠre Variablen zur Zwischenspeicherung der Werte,
		  * da sonst der neue x-Wert fŸr die Rotationsberechnung des y-Werts
		  * verwendet wŸrde.
		  */

		double x_new = this.x * Math.cos(winkel) - this.y * Math.sin(winkel) + zentrum.x * (1-Math.cos(winkel)) + zentrum.y * Math.sin (winkel);

		double y_new = this.x * Math.sin(winkel) + this.y * Math.cos(winkel) + zentrum.y * (1-Math.cos(winkel)) - zentrum.x * Math.sin (winkel);

		/** Neue Koordinaten nach der Drehung in den Instanzvariablen ablegen */

		this.x = x_new;
		this.y = y_new;

	} // 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 einzelnen Punkt: Linie mit Laenge 1 */

		g2.drawLine ((int)x, (int)y, (int)x, (int)y);

	} // zeichnen ()

	/**
	  * Punkt (x, y) : Konstruktor der Klasse Punkt.
	  *
	  * Belegt die Instanzvariablen x und y mit den Ÿbergebenen Werten.
	  *
	  * @param x x-Koordinate des Punktes
	  * @param y y-Koordinate des Punktes
	  * 
	  */

	public Punkt (double x, double y)
	{

		this.x = x;
		this.y = y;
		
	} // Konstruktor ()

	/**
	  * clone () : Klont das Objekt (= den Punkt), bei dem clone () aufgerufen wurde.
	  *
	  * Bei der Weiterverarbeitung muss ein Cast verwendet werden, da der Compiler
	  * den Objekttyp nicht von selbst erkennt, z. B.
	  *
	  * Punkt sudelfeld = (Punkt)bestehenderPunkt.clone ();
	  *                    ^^^^^
	  * (wobei bestehenderPunkt ein bestehendes Objekt vom Typ Punkt sei)
	  *
	  * @return Das geklonte Objekt (= der geklonte Punkt)
	  * 
	  */

	public Object clone ()
	{

		Punkt cloned = new Punkt (this.x, this.y);
		return (cloned);

	} // clone ()

} // Klasse Punkt
