====== 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}}