Table of Contents

L-Systems

Ziel ist es, die Turtle-Sprache noch weiter zu kondensieren und eine «eigene Programmiersprache» zu definieren. Dazu muss natürlich ein Programm geschrieben werden, das «unsere Sprache» ausführen kann.

Beispiel: Ein Quadrat kann wie folgt beschrieben werden: F+F+F+F, wobei F für forward (zeichnen) und + für left (drehen). Der Drehwinkel muss dabei auf 90° festgelegt werden.

Elementare Sprache

Grundlegender Code

Wir verwenden die Turtle-Library. Code an der Tafel.

Substitution

Wir definieren Regeln, womit Grossbuchstaben in unserem Code mit anderem Code ersetzt werden.

Beispiel: F ersetzen durch F+F--F+F.

Das kann natürlich nicht unendlich oft geschehen. Es wird also ein zusätzlicher Parameter tiefe übergeben, der festelegt, wie oft die Ersetzung stattfinden soll.

Code an der Tafel.

Position (Zustand) merken

Wir führen folgende Zeichen ein:

Code-Erweiterung an der Tafel.

Beispiel: zeichne("F", {"F":"F(+F+F)F(--F+F)F"}, 2) liefert dann

Weitere Erweiterungen

Es können weitere Befehle definiert werden, wie z.B. b (für Blatt), der die Farbe auf grün und Dicke der Linie auf 4 ändert, wenn die tiefe 0 beträgt. Diese Parameter müssen dann zusätzlich gespeichert und wieder hergestellt werden:

if c=="b" and tiefe==0:
  pencolor("green")
  pensize(4)

und

states.append({'position':position(), 'heading':heading(), 'pencolor':pencolor(), 'pensize':pensize()})

und

penup()
state = states.pop()
setposition(state['position'])
setheading(state['heading'])
pencolor(state['pencolor'])
pensize(state['pensize'])
pendown()

Zufall

from random import random
 
nulleins = random()  # Zufällige «reelle» Zahl im Intervall [0,1)

Damit kann z.B. zum Drehwinkel jeweils ein zufälliger Winkel addiert werden, bzw. vor dem Zeichnen noch zufällig etwas gedreht werden. Auch kann die Länge der Striche variiert werden.

Weitere berühmte Kurven

Drachenkurve

Man faltet einen Papierstreifen immer wieder hälftig. Dann öffnet man diesen so, dass alle Falze 90° sind.

zeichne("A",{"A":"A+B", "B":"A-B"},13)

Wir führen dazu die neue Regel ein, dass alle Grossbuchstaben gezeichnet werden (wie F):

if c>="A" and c<="Z":     # anstatt c=="F":

Hilbertkurve

Hier werden die Buchstaben A und B nicht gezeichnet…

zeichne("A", {"A":"+BF-AFA-FB+", "B":"-AF+BFB+FA-"},2)

Zu zeichnende Buchstaben festlegen

Den regeln wird ein weiterer Parameter draw hinzugefügt, indem eine Liste mit Buchstaben gespeichert wird, die gezeichnet werden sollen.

Die Drachenkurve wird dann wie folgt definiert:

zeichne("A",{"A":"A+B", "B":"A-B", "draw":"AB"},8)

Die Bedingung zum Zeichnen ist dann

if c in regeln['draw']:

Damit alter Code noch läuft, kann am Anfang der Funktion zeichne die Präsenz des Schlüssels draw in den Regeln überprüft werden. Fehlt der Schlüssel wird dieser auf F gesetzt:

if not "draw" in regeln:
   regeln['draw'] = 'F'

Sierpinski Dreieck annähern

zeichne("A", {"A":"+B-A-B+", "B":"-A+B+A-", "draw":"AB"}, 4)