1. Einleitung 2. Fraktale und Natur 3. Programmieren von Fraktalen 3.1. Die Programmiersprache C++
3.2. Pythagorasbaum 3.2.1. Mutation 1 3.2.2. Mutation 2 3.3. Astbaum 3.4. Lindenmayer System
3.4.1. Einführung 3.4.2. Programm 3.4.3. Eigene Beispiele 4. Nachwort 5. Ehrlichkeitserklärung
Literaturverzeichnis und Internetadressen
3.2. Pythagorasbaum
Erinnern wir uns an den Lehrsatz von Pythagoras. Für jedes rechtwinklige Dreieck gilt: Die beiden Quadrate über den Katheten haben zusammen den gleichen Flächeninhalt wie das Quadrat über der Hypotenuse.
Abb. 2
Es gilt: c² = a² + b²
Der fraktale Pythagorasbaum besteht aus unendlicher Wiederholung dieser Grundfigur.
In einem ersten Schritt wird ein einzelnes Quadrat gezeichnet:
Abb. 3
Im zweiten Schritt wird daraus eine Figur, wie sie in Abbildung 4 dargestellt ist. Vorgegeben ist der Anwinkel a und mit diesem auch der Gegenwinkel ß. Der Gegenwinkel ß ist 90-a, da in einem Dreieck alle Winkel zusammen 180 geben müssen und wir hier ein rechtwinkliges Dreieck haben:
Abb. 4
Im dritten Schritt werden auf die im zweiten Schritt entstandenen Quadrate jeweils zwei weitere Quadrate so aufgesetzt, dass wieder ein Dreieck mit den Winkeln a und ß entsteht:
Abb. 5
Dies wird beliebig oft fortgeführt. In jedem Schritt werden auf jedes der im vorherigen Schritt entstandenen Quadrate zwei neue Quadrate aufgesetzt. Die Dreiecke, die dabei entstehen, sind alle ähnlich zueinander, besitzen also die gleichen Winkel.
Folgende Abbildung zeigt den pythagoreischen Baum nach 17 Schritten.
Abb. 6
Neben der Anzahl von Schritten kann nun auch der Winkel des Dreiecks beliebig variiert werden:
So entstehen unterschiedliche Bäume. Abbildung 7 zeigt einen weiteren Baum nach 15 Schritten.
Abb. 7
Im folgendem soll ein Programm erstellt werden, das den Pythagorasbaum zeichnet.
Das Programm beinhaltet eine Funktion, welche ein einzelnes Quadrat zeichnet. Die Funktion fordert folgende Eingangswerte an:
- Die Position x|y, an welcher das Quadrat gezeichnet werden soll.
- Der relative Winkel d des Quadrates (Winkel zur Waagrechten)
- Die Seitenlänge s des Quadrates
Abb. 8
Das Quadrat wird gezeichnet, indem zuerst alle Eckpunkte berechnet werden, welche dann mit Linien miteinander verbunden werden.
Dabei werden die Variablen ?x und ?y verwendet. Sie sind die Differenzen der X- bzw. Y-Koordinaten von Punkt A und B. Diese werden mit Hilfe des relativen Winkels d und der Seitelänge s berechnet:
? x = cos( d ) * s
? y = sin( d ) * s
Die gleichen Differenzen kommen auch zwischen den Punkten BC, CD und DA vor.
Die Werte für Ax und Ay, also die X- und Y-Koordinate für den Punkt A, werden an die Funktion gesendet. Sie sind also gegeben.
Die Koordinaten der restlichen Eckpunkte lassen sich folgendermassen berechnen:
Abb. 9
Bx = Ax + ? x
By = Ay + ? y
Cx = Bx – ? y
Cy = By + ? x
Dx = Cx – ? x
Dy = Cy – ? y
Zu Beginn des Programms wird diese Funktion einmal aufgerufen, sodass ein Quadrat gezeichnet wird. In dieser Funktion werden zusätzlich die Positionen, relativen Winkel und Seitenlängen der beiden neuen Quadrate, die über dem in der Funktion gezeichnetem Quadrat entstehen, berechnet. Darauf gelangt man mit Hilfe der Koordinaten von C und D, des relativen Winkels d und des Winkels a durch folgende Rechnungen:
Abb. 10
= cos( a ) * s
= 
= cos( f ) * 
= sin(f) * 
Daraus folgt: Ex = Dx + 
Ey = Dy + 
Nun hat das Programm alle nötigen Werte, um in der Funktion die Funktion zwei weitere Male aufzurufen. Einmal für das Zeichnen des Quadrates über
und einmal für das Zeichnen des Quadrates über
. Diese haben folgende Eingabewerte:
Funktion |
Position(x|y) |
Winkel d |
Seitenlänge s |
Quadrat über  |
Dx|Dy |
a + d |

|
Quadrat über  |
Ex|Ey |
a + d – 90 |

|
Tab. 1
Die Funktion ruft also zweimal sich selber auf und berechnet jeweils die neuen Koordinaten für alle Quadrateckpunkte und ruft sich wieder jeweils zwei weitere Male auf mit neu berechneten Eingabewerten. So werden pro Quadrat durch erneute Funktionsaufrufe immer noch zusätzlich zwei weitere Quadrate erzeugt. Das Programm würde nicht aufhören Quadrate zu zeichnen, da immer wieder neue erzeugt werden. Um diese unendliche Ausführung zu stoppen, wird eine Variable „tiefe“ verwendet. Diese ist zu Beginn gleich Eins und wird bei jedem Funktionsaufruf um Eins erhöht.
Funktion |
Tiefe |
Quadrat über  |
tiefe+1 |
Quadrat über  |
tiefe+1 |
Tab. 2
Die Variable „tiefe“ gibt darüber Bescheid, wie tief die Funktion schon verschachtelt ist. Wird das Programm mit beispielsweise 17 Iterationen
¹ ausgeführt, so darf die Variable „tiefe“ nie höher als dieser Sollwert 17 sein. Deshalb ist die Funktion so ausgerichtet, dass sie sich nur dann selber aufruft, wenn in der Funktion der Wert „tiefe“ kleiner als dieser Sollwert ist. Dieser Sollwert kann vom Benutzer bestimmt werden.
Dies ist das Grundprinzip meines Programms Pythagorasbaum.exe
².
Wird das Programm gestartet, so wird das Fraktal nach einem Schritt gezeichnet. Mit der Nach-oben-Taste kann jedoch die Anzahl Schritte erhöht werden. Je höher die Anzahl Schritte ist, desto länger braucht der Computer für die Berechnung des Baumes. Bei einer sehr hohen Anzahl, beispielsweise 20, kann man sehr gut sehen, wie die Funktionen chronologisch aufgerufen werden. Durch Drücken der Nach-unten-Taste wird die Anzahl Schritte gesenkt. Ist diese gleich Eins, so bleibt sie Eins.
Der Benutzer kann mit den Nach-links- und Nach-rechts-Pfeiltasten den Winkel a variieren. Der Minimal- bzw. Maximalwert liegt dabei bei Null resp. 90 Grad.
¹ Iteration bedeutet soviel wie „wiederholtes Anwenden“.
² Das Programm kann auf der Download Seite heruntergeladen werden.
Zurück Weiter