15.4    Der Pythagoras-Baum

Der Pythagoras-Baum ist ein Fraktal, das sich aus drei Quadraten zusammensetzt. Sie sehen es in Abbildung 15.6.

Symmetrischer Pythagoras-Baum für die erste Entwicklungsstufe

Abbildung 15.6     Symmetrischer Pythagoras-Baum für die erste Entwicklungsstufe

Über ein großes Quadrat mit der Seitenlänge c wird an der linken oberen Ecke ein um den Winkel α nach links gedrehtes Quadrat mit der Seitenlänge b gezeichnet. An der rechten oberen Ecke des großen Quadrates wird ein um den Winkel β nach rechts gedrehtes Quadrat mit der Seitenlänge a gezeichnet. Die rechte untere Ecke des linken Quadrates muss die linke untere Ecke des rechten Quadrates berühren.

Die Berührungspunkte der beiden unteren Seiten a und b müssen auf einem Thales-Kreis liegen. Sie bilden zusammen mit der Seitenlänge c des unteren Quadrates ein rechtwinkliges Dreieck mit den Katheten a und b.

Als Erstes wird der linke Bereich des Baumes n-mal gezeichnet, danach wird der rechte Bereich des Baumes n-mal gezeichnet. Bei jedem neuen Zeichenvorgang müssen die Längen der Hypotenusen den Längen der Katheten angepasst werden.

Der folgende rekursive Algorithmus beschreibt die Konstruktion eines Pythagoras-Baumes:

1. Zeichne ein Quadrat.
2. Zeichne über dieses Quadrat ein um den Winkel α
nach links gedrehtes Quadrat mit der Kathete b.
3. Wiederhole Schritt 1 und 2 für die Kathete b n-mal.
4. Zeichne über das Quadrat aus Schritt 1 ein um den Winkel β
nach rechts gedrehtes Quadrat mit der Kathete a.
5. Wiederhole Schritt 1 und 4 für die Kathete a n-mal.

In Abbildung 15.7 ist ein symmetrischer Pythagoras-Baum für elf Rekursionen dargestellt.

Symmetrischer Pythagoras-Baum

Abbildung 15.7     Symmetrischer Pythagoras-Baum

Die Längen der Katheten a und b werden mit dem Kosinus berechnet. Für die linke Kathete b gilt:

formula

Und für die rechte Kathete a gilt:

formula

Der Winkel β muss nicht vorgegeben werden, weil im rechtwinkligen Dreieck gilt: formula.

Listing 15.7 erzeugt eine Turtle-Grafik für einen symmetrischen Pythagoras-Baum. Wenn Sie einen asymmetrischen Pythagoras-Baum darstellen wollen, dann können Sie den Winkel α in Zeile 31 ändern. Gegebenenfalls muss die Startposition des Zeichenstiftes auf der x-Achse in Zeile 42 angepasst werden.

01  #07_pythagoras_baum.py
02 import math as math
03 from turtle import *
04 #Quadrat zeichnen
05 def quadrat(a):
06 p.color('green')
07 p.begin_fill()
08 for _ in range(4):
09 p.forward(a)
10 p.right(90)
11 p.end_fill()
12 #Baum zeichnen
13 def baum(c,alpha,n):
14 a=c*math.cos(math.radians(90-alpha))
15 b=c*math.cos(math.radians(alpha))
16 quadrat(c)
17 if n==0:
18 return
19 else:
20 p.forward(c)
21 p.left(alpha)
22 baum(b,alpha,n-1)
23 p.right(90)
24 p.forward(b)
25 baum(a,alpha,n-1)
26 p.forward(-b)
27 p.left(90-alpha)
28 p.forward(-c)
29 #Hauptprogramm
30 n=11
31 winkel=45
32 c0=80
33 wn = Screen()
34 wn.bgcolor('white')
35 wn.setup(width = 640, height = 480)
36 wn.title("Pythagoras-Baum")
37 wn.tracer(False)
38 p = Turtle()
39 p.pencolor('green')
40 p.speed(1)
41 p.penup()
42 p.setpos(-40,-180)
43 p.pendown()
44 p.setheading(90)
45 baum(c0,winkel,n)
46 wn.update()
47 wn.mainloop()

Listing 15.7     Der Pythagoras-Baum

Analyse

Die Python-Funktion quadrat(a) zeichnet ein mit grüner Farbe gefülltes Quadrat mit der Seitenlänge a (Zeilen 05 bis 11). Die Farbe können Sie in Zeile 06 ändern.

In den Zeilen 14 und 15 werden die Katheten a und b berechnet. In Zeile 16 wird ein Quadrat gezeichnet. Bei jedem rekursiven Funktionsaufruf (Zeile 22 und 25) wird die aktualisierte Länge der Kathete an die Funktion quadrat(a) übergeben. In Zeile 22 werden die Quadrate über die Kathete b des linken Baumzweiges gezeichnet. In Zeile 25 werden die Quadrate über die Kathete a des rechten Baumzweiges gezeichnet. In den Zeilen 22 und 25 ruft die Funktion baum(b,alpha,n-1) sich selbst auf. Bei jedem Funktionsaufruf wird n um 1 reduziert. Wenn n==0 wird, dann wird die Rekursion abgebrochen (Zeile 17).

Übung

Kommentieren Sie die Zeilen 25 und 37 aus. Testen Sie das Programm mit der Rekursionstiefe von n=4, und beobachten Sie die Änderung.

Entfernen Sie den Kommentar in Zeile 25, und kommentieren Sie die Zeile 22 aus. Testen Sie das Programm, und beobachten Sie die Änderung.

Kommentieren Sie Zeile 37 aus, und erhöhen Sie in Zeile 30 die Rekursionstiefe n schrittweise von 1 bis 5. Beobachten Sie nach jedem neuen Programmstart die einzelnen Entwicklungsstufen des Fraktals.

Entfernen Sie den Kommentar in Zeile 37, und beobachten Sie die Entwicklungsstufen von 6 bis 12. Tragen Sie in Zeile 31 einen Winkel von 30° ein, und simulieren Sie einen asymmetrischen Pythagoras-Baum. Damit der Baum vollständig dargestellt wird, müssen Sie die x-Koordinate in Zeile 42 ändern.