image image


Ein Busch als L-System mit der Turtle in Processing.py

Über Lindenmayer- oder L-Systeme hatte ich vor genau einem Monat geschrieben. Damals hatte ich das Sierpinski-Dreieck in Processing.py implementiert, ohne das Turtle-Modul zu kennen. Entsprechend komplex fiel die plot()-Funktion damals aus. Nun hatte ich Lust, wieder etwas mit einem L-System anzustellen, dieses Mal wollte ich jedoch das Turtle-Modul für Processing.py verwenden.

image

Axiom und Produktionsregeln für obigen Busch hat Aristid Lindenmayer in seinem zusammen mit Przemyslaw Prusinkiewicz 1990 herausgegebenem Buch »The Algorithmic Beauty of Plants« auf Seite 25 beschrieben. Der Busch hat das Axiom F und die Produktionsregel F -> FF-[-F+F+F]+[+F-F-F]. Die Rekursionstiefe beträgt n = 4 und der Winkel 𝛿 = 22.5°.

Was bedeuten nun die Symbole der Produktionsregel für die Turtle. Eigentlich ganz einfach:

  • F: Vorwärtsbewegung mit Zeichenstift unten
  • +: Rechtsdrehung um vorgegebenen Winkel
  • -: Linksdrehung um vorgegebenen Winkel
  • [: Speichern des Turtle-Zustands auf einen Stack
  • ]: Abruf des Turtle-Zustands vom Stack

Für die beiden letzten Symbole hat Leah Buechley in ihrem Turtle-Modul netterweise die Funktionen push() und pop() implementiert, so daß der Quellcode für das Zeichnen des Busches (Funktion plot() im Quellcode) entsprechend kompakt ausfällt:

add_library('Turtle')
import math

num_gen = 4
len_seg = 6 
a = 22.5  # Winkel
axiom = "F"
sentence = axiom
rules = {"F": "FF-[-F+F+F]+[+F-F-F]"}

def setup():
    global p
    size(400, 400)
    this.surface.setTitle("Lindenmayer Tree 1")
    background(50)
    strokeWeight(1)
    stroke(150, 255, 100)
    p = Turtle(this)
    generate(num_gen)
    noLoop()

def draw():
    p.penUp()
    p.goToPoint(width/2, height - 20)
    p.penDown()
    plot(p)
    print("I did it, Babe")
    
def generate(n):
    global sentence
    for i in range(n):
        next_sentence = ""
        for c in sentence:
            next_sentence += rules.get(c, c)
        sentence = next_sentence
        
def plot(p):
    for c in sentence:
        if c == "F":
            p.forward(len_seg)
        elif c == "+":
            p.right(a)
        elif c == "-":
            p.left(a)
        elif c == "[":
            p.push()
        elif c == "]":
            p.pop()

Ich glaube, das war es erst einmal mit der Turtle. Ich wollte mich ja auch noch JavaScript (P5.js) und Pygame zuwenden. So viel zu spielen und so wenig Zeit!

image


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image