====== 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 (wie ''forward'' bei 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.
{{lehrkraefte:blc:informatik:glf25:turtle:koch.svg?200}}
===== 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
{{lehrkraefte:blc:informatik:glf25:turtle:lsystem.svg?200}}
===== 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()
{{lehrkraefte:blc:informatik:glf25:turtle:leaves.svg?200}}
==== 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":
{{lehrkraefte:blc:informatik:glf25:turtle:dragon.svg?200}}
==== Hilbertkurve ====
* https://en.wikipedia.org/wiki/Hilbert_curve
Hier werden die Buchstaben ''A'' und ''B'' nicht gezeichnet...
zeichne("A", {"A":"+BF-AFA-FB+", "B":"-AF+BFB+FA-"},2)
{{lehrkraefte:blc:informatik:glf25:turtle:hilbert.svg?200}}
==== 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)
{{lehrkraefte:blc:informatik:glf25:turtle:sierpinski.svg?200}}