/*
Datei............: Aufg1443.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 29.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 14.43
Kommentare.......:

Der Baum des Phytagoras kann am besten durch eine rekursive Methode
erzeugt werden. In diesem Programm implementieren wir dazu die
Methode drawPythTree, die die benötigten Ausgabefunktionen in sich
vereint. Sie zeichnet jeweils ein Quadrat und ruft sich selbst 
zweimal zum Zeichnen der Kathetenquadrate auf.
*/
import java.awt.*;
import java.awt.event.*;

public class Aufg1443
extends Frame
{
  public static void main(String[] args)
  {
	Aufg1443 wnd = new Aufg1443();
	wnd.setSize(600,450);
	wnd.setVisible(true);
  }

  public Aufg1443()
  {
	super("Aufg1443");
	addWindowListener(
	  new WindowAdapter() {
	    public void windowClosing(WindowEvent event) {
		  System.exit(0);
		}
	  }
    );
	setBackground(Color.lightGray);
  }

  public void paint(Graphics g)
  {
	TurtleGraphics tg = new TurtleGraphics(g, this);
	//Turtle weiter nach unten bewegen
	tg.turnLeft(90);
	tg.moveForward(150);
	tg.turnLeft(90);
	tg.moveForward(120);
	tg.turnRight(180);
	tg.dropPen();
	//draw figure
	drawPythTree(tg, 60, 1.0, 3.0, 2);
  }

  /**
   * Diese Methode zeichnet den Baum des Phytagoras an der aktuellen
   * Turtle-Position. Dabei zeichnet die Methode ein Quadrat der Länge len
   * an der aktuellen Position und durch rekursiven Aufruf von sich
   * selbst die beiden Kathetenquadrate. Die beiden Parameter side1 und
   * side2 geben dabei das Seitenverhältnis der Katheten an. Der
   * Parameter drawlimit begrenzt die Rekursionstiefe; er bezeichnet 
   * die kleinste Seitenlänge, bei der noch ein Quadrat gezeichnet wird.
   */
  private void drawPythTree(
    TurtleGraphics tg,
	double len,
	double side1,
	double side2,
	int drawlimit
  )
  {
	//Berechnen der Kathetenwinkel
	double hyp   = Math.sqrt(side1*side1 + side2*side2);
	double alpha = Math.asin(side2 / hyp) * 360.0 / (2 * Math.PI);
	double beta  = Math.asin(side1 / hyp) * 360.0 / (2 * Math.PI);
	if (len >= drawlimit) {
	  //Rechte Kante
	  tg.moveForward((int)len);
	  tg.turnLeft(90.0);
	  //Quadrat über der rechten Kathete
	  tg.pushState();
	  tg.turnRight(90.0 + beta);
	  drawPythTree(tg, len * side2 / hyp, side1, side2, drawlimit);
	  tg.popState();
	  //Obere Kante
	  tg.moveForward((int)len);
	  tg.turnLeft(90.0);
	  //Quadrat über der linken Kathete
	  tg.pushState();
	  tg.turnLeft(90.0 + alpha);
	  tg.liftPen();
	  tg.moveForward((int)(len * side1 / hyp));
	  tg.dropPen();
	  tg.turnLeft(90.0);
	  drawPythTree(tg,len * side1 / hyp, side1, side2, drawlimit);
	  tg.popState();
	  //Linke Kante
	  tg.moveForward((int)len);
	  tg.turnLeft(90.0);
	  //Untere Kante
	  tg.moveForward((int)len);
	  tg.turnLeft(90.0);
	}
  }
}

