Skip to content

Instantly share code, notes, and snippets.

@WitherOrNot
Last active January 9, 2020 20:02
Show Gist options
  • Save WitherOrNot/f4408461d9b8d8324f7f1b8ab4ea72a3 to your computer and use it in GitHub Desktop.
Save WitherOrNot/f4408461d9b8d8324f7f1b8ab4ea72a3 to your computer and use it in GitHub Desktop.
Turtle that draws L-Systems
import turtle
t = turtle.Turtle()
s = turtle.Screen()
t.pu()
t.goto(0,0)
t.pd()
t.speed(0)
# mod here
#sub = {"X":"F[-X][X]F[-X]+FX","F":"FF"}; n = 4; angle = 25; state = "X"; f = lambda: t.fd(5) # Fractal tree
#sub = {"A":"-BF+AFA+FB-","B":"+AF-BFB-FA+"}; n = 4; angle = 90; state = "A"; f = lambda: t.fd(5) # Hilbert curve
#sub = {"F":"F-F+F+FF-F-F+F"}; n = 2; angle = 90; state = "F-F-F-F"; f = lambda: t.bk(5) # Quadratic Koch curve
#sub = {"X":"X+YF+","Y":"-FX-Y"}; n = 10; angle = 90; state = "FX"; f = lambda: t.bk(5) # Dragon curve
#sub = {"F":"F+f-FF+F+FF+Ff+FF-f+FF-F-FF-Ff-FFF","f":"ffffff"}; n = 2; angle = 90; state = "F+F+F+F"; f = lambda: t.bk(5) # Lakes and Islands
#sub = {"F":"F-G+F+G-F","G":"GG"}; n = 4; angle = 120; state = "F-G-G"; f = lambda: t.fd(5) # Sierpinski triangle
#sub = {"F":"+F--F+"}; n = 10; angle = 45; state = "F"; f = lambda: t.fd(5) # Levy C curve
#sub = {"F":"FF+F++F+F"}; n = 3; angle = 90; state = "F+F+F+F"; f = lambda: t.fd(5) # Crystal curve
#sub = {"F":"F-F+F+F-F"}; n = 3; angle = 90; state = "F-F-F-F"; f = lambda: t.fd(5) # Box Fractal
#sub = {"F":"FF+F+F+F+FF"}; n = 3; angle = 90; state = "F+F+F+F"; f = lambda: t.fd(5) # Board Fractal
#sub = {"X":"X+YF++YF-FX--FXFX-YF+", "Y":"-FX+YFYF++YF+FX--FX-Y"}; n = 3; angle = 60; state = "FX"; f = lambda: t.fd(5) # Peano-Gosper Curve
#sub = {"F":"F++F++F+++++F-F++F"}; n = 3; angle = 36; state = "F++F++F++F++F"; f = lambda: t.fd(5) # Pentaplexity
#sub = {"F":"FF+F-F+F+FF"}; n = 3; angle = 90; state = "F+F+F+F"; f = lambda: t.fd(5) # Tiles Fractal
#sub = {"F":"F-F+F"}; n = 5; angle = 120; state = "F+F+F"; f = lambda: t.fd(5) # Triangle Dragon
# don't mod past here
def uf():
t.pu()
f()
t.pd()
p = lambda: t.right(angle)
m = lambda: t.right(-angle)
tpos = []
def pushpos():
global tpos
tpos.append((t.heading(), t.pos()))
def poppos():
global tpos
head, pos = tpos.pop()
t.pu()
t.goto(pos)
t.seth(head)
t.pd()
consts = {"F":f, "f":uf, "G":f, "+":p, "-":m, "[":pushpos, "]":poppos}
for _ in range(n):
state = ''.join([sub[x] if x in sub else x for x in state])
print(state)
for x in state:
if x in consts:
consts[x]()
t.ht()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment