16.7 Pythagoras Baum
 
Erste Stufe In der ersten Stufe hat der Pythagoras-Baum die folgende Gestalt:

Man gibt ein Quadrat mit einer bestimmten Seitenlänge vor. Über der einen Seite zeichnet man ein rechtwinkliges Dreieck (in unserem Beispiel hat dieses die Winkel 300 und 600). Über die noch freien Katheten zeichnet man die Kathetenquadrate. Es entsteht die bekannte Darstellung zum Pythagoräischen Lehrsatz. Den Pythagoras-Baum erhält man nun, wenn man die Kathetenquadrate selbst wieder als Hypothenusenquadrate für die nächste Generation auffasst. Wir erhalten dann das nächste Bild. Wichtig ist anzumerken, dass das kleinere Kathetenquadrat keine nachfolgende Generation erzeugt, da seine Länge die Abbruchbedingung der Rekursion erreicht. Die Abbruchbedingung wird über die Seitenlänge des linken Kathetenquadrats festgelegt. Setzten wir diese niedriger, erhöhen wir die Rekursionstiefe. Die nächste Generationen lieferen aber immer noch nur weitere Generationen für das linke Kathetenquadrat. Erst wenn die Rekursionstiefe genügend groß ist, erscheinen in der grafischen Darstellung auch Nachfolgegenerationen für die rechten Kathetenquadrate: 

  Es handelt sich in unseren Darstellungen noch nicht um den Pythagoras-Baum, Den erhalten wir erst, wenn wir die Darstellung idealisieren, genauer, wenn wir uns die Rekursionstiefe unendlich "vorstellen". Einen Eindruck von der Figur bekommen wir, wenn wir die (in Programmen immer endlichen) Rekursionstiefe sehr groß machen, z.B. so, dass erst dann keine weitere Generationen erzeugt werden, wenn die Seitenlönge des linken Quadrats ein Pixel unterschreiten würde. Kommen wir also zu der Frage, wie programmieren wir die Methode zeichnen() in der Klasse Pythagoras-Baum?
 
Der Algorithmus Die Methode zeichne() in Umgangssprache: Die Turtle sitze im Ausgangs-punkt. Zuerst wir ein Quadrat gezeichnet. Danach bewegt sich die Turtle auf den Punkt P_li, dreht ihre Blickrichtung um 300 nach links (der dicke Pfeil gibt die Blickrichtung der Turtle an). Dann erfolgt der rekursive Aufruf der Methode zeichne(). Die Turtle bewegt sich mit neuer Blickrichtung in den Punkt P_re. Wieder der rekursive Aufruf der Methode zeichne(). Schließlich wird die Turle wieder in den Ausgangspunkt gesetzt. Eine wichtige Anmerkung:  Das Bewegen zu den Punkten P_li und P_re geht immer vom Ausgangspunkt aus, wohin die Turtle zunächst gesetzt werden muss. Der Grund dafür ist, die manglnde Genauigkeit beim Zeichnen, wenn man die Bewegungen alleiun mit den Turtle-Methoden vor(..) und rechts(..) bewerkstelligt. Die Ungenauigkeit schaukelt sich mit zunehmender Rekursionstiefe immer höher, so dass die rechtwinklige Dreiecke nicht mehr geschlossen erscheinen.
Die Klasse Pythagoras Baum.java
public class PythagorasBaum{

   public void zeichneQuadrat(Turtle t,int l){
      for (int i = 0; i<4; i++){
         t.vor(l); t.rechts(90);
      }
   }

   public void zeichne (Turtle t, int l){
         int xa = t.getTurtleX();
         int ya = t.getTurtleY();
         zeichneQuadrat(t,l);
         if (l>0){
            t.vor(l);
            t.rechts(-30);
            zeichne(t,(int)(0.5*l*Math.sqrt(3)));
            t.rechts(30);
            t.setzeTurtle(xa,ya);
            t.vor(l);
            t.rechts(60);
            t.vor( (int)(0.5*l*Math.sqrt(3)) );
            zeichne(t,(int)(0.5*l));
            t.rechts(-60);
            t.setzeTurtle(xa,ya);
         }
   }
}
Downloads:
 
Turtle.class
PythagorasBaum.java
PythagorasBaumDemo. java
   
zu den Hausaufgaben
zur Startseite www.pohlig.de  (C) MPohlig 2003