This is an old revision of the document!
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
F: Linie in aktueller Richtung zeichnen (wieforwardbei der Turtle). Die Länge wird als konstant angenommen.+und-: Drehung in positiver oder negativer Richtung. Der Drehwinkel wird als konstant angenommen.
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:
(Position und Richtung merken (künftig evtl. auch weitere Dinge wie Schrittlänge/Winkeländerung/Farbe etc.))Zuletzt gemerkte Posittion und Richtung wieder herstellen.
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'