Koch-Kurve

Die Koch-Kurve (siehe Wikipedia Artikel) als Lindenmayer-System:

Start: f

Ersetzungsregel: f → f + f -- f + f

wobei eine Turtle-Grafik verwendet wird: "f" zieht eine Gerade fester Länge, "+" dreht um 60° im Uhrzeigersinn und "-" um 60° gegen den Uhrzeigersinn.

Nur der Start dargestellt:

1. Iteration:

2. Iteration:

3. Iteration:

4. Iteration:

Man kann als Start des Lindenmayer-Systems auch "f ++++ f ++++ f" wählen und bekommt dann die Kochsche Schneeflocke. Der Start ist hierbei keine Gerade, sondern ein gleichseitiges Dreieck:

4. Iteration:

Man kann eine Koch-Kurve auch auf einem Sechseck statt einem Dreieck anwenden. Hier ein Beispiel dafür, wenn man die Regel nach innen statt nach außen anwendet:

Start:

1. Iteration:

2. Iteration:

Da man mit Dreiecken und Sechsecken die Ebene pflastern kann:

geht dies auch mit den beiden eben vorgestellten Formen der Kochschen Schneeflocke:

1. Iteration:

2. Iteration:

Dieses Bild ist übrigens ebenfalls mit einem einzigen Lindenmayer-System erstellt worden:

Start: k7 + k7 + k7 + k7 + k7 + k7

Regeln:

k → d fff ++++ fff ++++ fff u
k2 → d fff + fff + fff + fff + fff + fff u
fff → fff + fff -- fff + fff
mf → mf mf mf
k6 → k2 +++ mf k +++ mf k +++ mf k +++ mf k +++ mf k +++ mf k mf
k7 → k6 k6 k6 k6 k6 k6 mf

Dabei sind die neuen Turtle-Befehle "u" für "pen up" und "d" für "pen down" hinzugekommen. Außerdem bestehen die einzelnen Symbole nicht mehr nur aus einem Zeichen, aber für die Turtle-Grafikausgabe werden jeweils alle Zeichen eines Symbols als einzelne Befehle betrachtet. Durch diesen Trick ist es möglich, z.B. das Symbol "mf" zu verwenden, sodaß "f" nicht durch die Koch-Kurve ersetzt wird, sondern nur zum versetzen des Turtles verwendet wird. Kurz erwähnt wurde ein ähnliches Verfahren bereits im Online verfügbaren Buch The Algorithmic Beauty of Plants, auf Seite 18.

Eine Parkettierung nur aus Sechsecken ist ebenfalls möglich, sofern man abwechselnd die Koch-Kurve nach innen und nach außen stülpt.

1. Iteration:

4. Iteration:

Diese Pflasterung der Ebene mit Sechsecken ist dann der Start:

1. Iteration:

2. Iteration:

3. Iteration:

Ein mögliches Lindenmayer-System dazu sieht so aus:

Start: k9 ++ k9 ++ k9

Regeln:

k9 → k3 ++ k3 ++ k3 ++
k3 → k ++ k ++ k mf ++
k → d f1 + f2 + f1 + f2 + f1 + f2 u +
f → f + f -- f + f
f1 → f1 + f1 -- f1 + f1
f2 → f2 - f2 ++ f2 - f2
mf → mf mf mf

Schließlich ist es auch möglich die Ebene mit einem Sechseck mit nach innen gestülpter Kurve und Iterationsstufe n, und einem Dreieck mit nach außen gestülpter Kurve und Iterationsstufe n+1 zu parkettieren:

Iterationstufe 0 und 1:

Iterationsstufe 1 und 2:

Iterationsstufe 2 und 3:

Iterationsstufe 3 und 4:

Folgendes Bild zeigt ein Dreieck mit nach außen gestülpter Koch-Kurve für die erste Iteration (blau), ein Sechseck (rot) und ein Dreieck (grün):

Wenn man den schwarzen Bereich genauer betrachtet und Schritt für Schritt die Iterationsregel auf das grüne Dreieck und das blaue Dreieck anwendet, dann sieht es so aus, als würden die Kurven für unendlich viele Iterationsschritte (was die Definition des Koch-Kurven Fraktals ist) identisch werden. Dies gilt auch für das rote Sechseck, wenn man dort die Iteration für eine nach innen gestülpte Koch-Kurve durchführt, die dann identisch mit der betrachteten schwarzen Seite des grünen Dreiecks ist. Daher kann man daraus schließen, daß man für unendlich viele Iterationsschritte auch zwei Sechsecke mit nach außen gestülpter Koch-Kurve verschiedener Größe verwenden kann um die Ebene lückenlos zu pflastern, wie Christopher Creutzig in diesem Newsgroup-Posting, und dem Bild unten, skizziert hat. Es zeigt zudem, daß die Form des Polygons für unendlich viele Iterationsschritte für ein Sechseck (mit nach innen gestülpter Koch-Kurve für alle Kanten), dieselbe ist, wie für ein Dreieck (mit nach außen gestülpter Koch-Kurve für alle Kanten).

 

Erstellt wurden die Grafiken mit diesem Common Lisp Programm, was die Bilder als Postscript ausgibt und in Photoshop nachbearbeitet.

Eine weitere Implementierung von Bastian Erdnüß in Haskell: snow.hs.


5 . August 2010, Frank Buß