/*
Datei............: Aufg1432.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 28.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 14.32
Kommentare.......:

In diesem Beispiel werden die Kochkurven mit Hilfe der 
Turtlegrafik gezeichnet. Das führt aufgrund der Ganzzahlarithmetik
leider zu einigen kleinen Rundungsfehlern, die für unsere Zwecke
aber nicht weiter ins Gewicht fallen.
<p>
Die eigentliche Arbeit wird in der rekursiven Methode drawKochKurve
erledigt. Sie unterteilt das Zeichnen einer Kochkurve der Länge len
in folgende vier Schritte:
<ul>
<li>Zeichnen einer Kochkurve der Länge len / 3 am Anfangspunkt.
<li>An deren Endpunkt Zeichnen einer Kochkurve der Länge len / 3 
unter einem Winkel von 60 Grad.
<li>An deren Endpunkt zeichnen einer Kochkurve der Länge len / 3
unter einem Winkel von miuns 120 Grad.
<li>An deren Endpunkt Zeichnen einer Kochkurve der Länge len / 3 
unter einem Winkel von 60 Grad.
</ul>
Die Rekursion wird abgebrochen, wenn len kleiner oder gleich 10
ist.
*/
import java.awt.*;
import java.awt.event.*;

public class Aufg1432
extends Frame
{
  public static void main(String[] args)
  {
	Aufg1432 wnd = new Aufg1432();
	wnd.setSize(400,400);
	wnd.setVisible(true);
  }

  public Aufg1432()
  {
	super("Aufg1432");
	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);

	//100 Pixel nach links und 50 nach unten
	tg.turnLeft(90);
	tg.moveForward(100);
	tg.turnLeft(90);
	tg.moveForward(50);
	//in Startposition und Schneeflocke zeichnen
	tg.turnLeft(135);
	drawKochKurve(tg, 200);
	tg.turnRight(120);
	drawKochKurve(tg, 200);
	tg.turnRight(120);
	drawKochKurve(tg, 200);
  }

  private void drawKochKurve(TurtleGraphics tg, int len)
  {
	if (len <= 10) {
	  tg.dropPen();
	  tg.moveForward(len);
	} else {
	  tg.liftPen();
	  tg.pushState();
	  drawKochKurve(tg, len / 3);
	  tg.turnLeft(60);
	  drawKochKurve(tg, len / 3);
	  tg.turnRight(120);
	  drawKochKurve(tg, len / 3);
	  tg.turnLeft(60);
	  drawKochKurve(tg, len / 3);
	  tg.popState();
	  tg.moveForward(len);
	}
  }
}

