Skip to content

Instantly share code, notes, and snippets.

@albusdemens
Created December 14, 2019 10:34
Show Gist options
  • Select an option

  • Save albusdemens/2ee1649aa990734db9ed8ff1f4c79c4e to your computer and use it in GitHub Desktop.

Select an option

Save albusdemens/2ee1649aa990734db9ed8ff1f4c79c4e to your computer and use it in GitHub Desktop.
from tkinter import *
from turtle import *
import turtle
SYSTEM_RULES = {} # generator system rules for l-system
def derivation(axiom, steps):
derived = [axiom] # seed
for _ in range(steps):
next_seq = derived[-1]
next_axiom = [rule(char) for char in next_seq]
derived.append(''.join(next_axiom))
return derived
def rule(sequence):
if sequence in SYSTEM_RULES:
return SYSTEM_RULES[sequence]
return sequence
def draw_l_system(turtle, SYSTEM_RULES, seg_length, angle):
stack = []
for command in SYSTEM_RULES:
turtle.pd()
if command in ["F", "G", "R", "L"]:
turtle.forward(seg_length)
elif command == "f":
turtle.pu() # pen up - not drawing
turtle.forward(seg_length)
elif command == "+":
turtle.right(angle)
elif command == "-":
turtle.left(angle)
elif command == "[":
stack.append((turtle.position(), turtle.heading()))
elif command == "]":
turtle.pu() # pen up - not drawing
position, heading = stack.pop()
turtle.goto(position)
turtle.setheading(heading)
def set_turtle(alpha_zero):
r_turtle = turtle.Turtle() # recursive turtle
r_turtle.screen.title("L-System Derivation")
r_turtle.speed(0) # adjust as needed (0 = fastest)
r_turtle.setheading(alpha_zero) # initial heading
return r_turtle
def main():
rule_num = 1
while True:
rule = input("Enter rule[%d]:rewrite term (0 when done): " % rule_num)
if rule == '0':
break
key, value = rule.split("->")
SYSTEM_RULES[key] = value
rule_num += 1
axiom = input("Enter axiom (w): ")
iterations = int(input("Enter number of iterations (n): "))
model = derivation(axiom, iterations) # axiom (initial string), nth iterations
segment_length = int(input("Enter step size (segment length): "))
alpha_zero = float(input("Enter initial heading (alpha-0): "))
angle = float(input("Enter angle increment (i): "))
# Set turtle parameters and draw L-System
r_turtle = set_turtle(alpha_zero) # create turtle object
turtle_screen = turtle.Screen() # create graphics window
turtle_screen.screensize(1500, 1500)
draw_l_system(r_turtle, model[-1], segment_length, angle) # draw model
#turtle_screen.exitonclick()
ts = turtle.getscreen()
ts.getcanvas().postscript(file="tree.eps")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment