/*
Datei............: Aufg1442.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 29.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 14.42
Kommentare.......:

Diese Klasse bildet das Rahmenprogramm für die Klasse TurtleGraphics,
die als eigentliches Problem der Aufgabe 14.42 erstellt werden sollte.
Es zeigt eine typische Anwendung der Turtle-Grafik am Beispiel der
Darstellung der Hilbert-Kurve siebter Ordnung. Hilbert-Kurven ähneln
Sierpinski-Kurven und sind regelmäßige flächenfüllende Muster, die
mit Hilfe rekursiver Berechnungsvorschriften erstellt werden können.
Eine Hilbert-Kurve der Ordnung n+1 besteht aus 4 Hilbert-Kurven der
Ordnung n, die nach einer festen Vorschrift (teilweise spiegelverkehrt)
angeordnet und durch Linien miteinander verbunden sind. Die Hilbert-Kurve
der Ordnung 1 sieht aus wie ein eckiges "u", das nach rechts umgekippt
ist. Weitere Details können Niklaus Wirth's Klassiker "Algorithmen und
Datenstrukturen" entnommen werden.
*/
import java.awt.*;
import java.awt.event.*;

public class Aufg1442
extends Frame
{
  public static void main(String[] args)
  {
	Aufg1442 wnd = new Aufg1442();
	wnd.setSize(440,440);
	wnd.setVisible(true);
  }

  public Aufg1442()
  {
	super("Aufg1442");
	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);

	//In die rechte untere Ecke bewegen
	tg.turnLeft(180);
	tg.moveForward(190);
	tg.turnLeft(90);
	tg.moveForward(190);
	tg.turnLeft(90);
	//Hilbert-Kurve der Ordnung 7 zeichnen
	tg.dropPen();
	g.setColor(Color.blue);
	drawHilbertKurve(tg, 7, false);
  }

  /**
   * Zeichnet die Hilbert-Kurve der Ordnung order. Falls mirrored gleich
   * true ist, wird die Kurve spiegelverkehrt gezeichnet.
   */
  private int drawHilbertKurve(TurtleGraphics tg, int order, boolean mirrored)
  {
	final int STEPSIZE = 3;
	int mult = mirrored ? -1 : 1;
	int prevsize, mysize;

	if (order <= 1) {
	  tg.moveForward(STEPSIZE);
	  tg.turnLeft(mult * 90);
	  tg.moveForward(STEPSIZE);
	  tg.turnLeft(mult * 90);
	  tg.moveForward(STEPSIZE);
	  mysize = STEPSIZE;
	} else {
	  tg.turnLeft(mult * 90);
	  prevsize = drawHilbertKurve(tg, order - 1, !mirrored);
	  tg.turnLeft(mult * 90);
	  tg.moveForward(STEPSIZE);
	  drawHilbertKurve(tg, order -1, mirrored);
	  tg.turnRight(mult * 90);
	  tg.moveForward(STEPSIZE);
	  tg.turnRight(mult * 90);
	  drawHilbertKurve(tg, order -1, mirrored);
	  tg.moveForward(STEPSIZE);
	  tg.turnLeft(mult * 90);
	  drawHilbertKurve(tg, order - 1, !mirrored);
	  tg.turnLeft(mult * 90);
	  mysize = 3 * prevsize;
	}
	return mysize;
  }
}

