Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== 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 ''<nowiki>F+F--F+F</nowiki>''. 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: ''<nowiki>zeichne("F", {"F":"F(+F+F)F(--F+F)F"}, 2)</nowiki>'' 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: <code python> if c=="b" and tiefe==0: pencolor("green") pensize(4) </code> und <code python> states.append({'position':position(), 'heading':heading(), 'pencolor':pencolor(), 'pensize':pensize()}) </code> und <code python> penup() state = states.pop() setposition(state['position']) setheading(state['heading']) pencolor(state['pencolor']) pensize(state['pensize']) pendown() </code> {{lehrkraefte:blc:informatik:glf25:turtle:leaves.svg?200}} ==== Zufall ==== <code python> from random import random nulleins = random() # Zufällige «reelle» Zahl im Intervall [0,1) </code> 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. <code python> zeichne("A",{"A":"A+B", "B":"A-B"},13) </code> Wir führen dazu die neue Regel ein, dass alle Grossbuchstaben gezeichnet werden (wie ''F''): <code python> if c>="A" and c<="Z": # anstatt c=="F": </code> {{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... <code python> zeichne("A", {"A":"+BF-AFA-FB+", "B":"-AF+BFB+FA-"},2) </code> {{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: <code python> zeichne("A",{"A":"A+B", "B":"A-B", "draw":"AB"},8) </code> Die Bedingung zum Zeichnen ist dann <code python> if c in regeln['draw']: </code> 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: <code python> if not "draw" in regeln: regeln['draw'] = 'F' </code> ==== Sierpinski Dreieck annähern ==== <code python> zeichne("A", {"A":"+B-A-B+", "B":"-A+B+A-", "draw":"AB"}, 4) </code> {{lehrkraefte:blc:informatik:glf25:turtle:sierpinski.svg?200}} lehrkraefte/blc/informatik/glf25/turtle/lsystems.txt Last modified: 2026/01/09 10:28by Ivo Blöchliger