109 lines
2.9 KiB
Python
109 lines
2.9 KiB
Python
|
#!/usr/bin/env python3
|
||
|
""" turtlegraphics-example-suite:
|
||
|
|
||
|
tdemo_forest.py
|
||
|
|
||
|
Displays a 'forest' of 3 breadth-first-trees
|
||
|
similar to the one in tree.
|
||
|
For further remarks see tree.py
|
||
|
|
||
|
This example is a 'breadth-first'-rewrite of
|
||
|
a Logo program written by Erich Neuwirth. See
|
||
|
http://homepage.univie.ac.at/erich.neuwirth/
|
||
|
"""
|
||
|
from turtle import Turtle, colormode, tracer, mainloop
|
||
|
from random import randrange
|
||
|
from time import perf_counter as clock
|
||
|
|
||
|
def symRandom(n):
|
||
|
return randrange(-n,n+1)
|
||
|
|
||
|
def randomize( branchlist, angledist, sizedist ):
|
||
|
return [ (angle+symRandom(angledist),
|
||
|
sizefactor*1.01**symRandom(sizedist))
|
||
|
for angle, sizefactor in branchlist ]
|
||
|
|
||
|
def randomfd( t, distance, parts, angledist ):
|
||
|
for i in range(parts):
|
||
|
t.left(symRandom(angledist))
|
||
|
t.forward( (1.0 * distance)/parts )
|
||
|
|
||
|
def tree(tlist, size, level, widthfactor, branchlists, angledist=10, sizedist=5):
|
||
|
# benutzt Liste von turtles und Liste von Zweiglisten,
|
||
|
# fuer jede turtle eine!
|
||
|
if level > 0:
|
||
|
lst = []
|
||
|
brs = []
|
||
|
for t, branchlist in list(zip(tlist,branchlists)):
|
||
|
t.pensize( size * widthfactor )
|
||
|
t.pencolor( 255 - (180 - 11 * level + symRandom(15)),
|
||
|
180 - 11 * level + symRandom(15),
|
||
|
0 )
|
||
|
t.pendown()
|
||
|
randomfd(t, size, level, angledist )
|
||
|
yield 1
|
||
|
for angle, sizefactor in branchlist:
|
||
|
t.left(angle)
|
||
|
lst.append(t.clone())
|
||
|
brs.append(randomize(branchlist, angledist, sizedist))
|
||
|
t.right(angle)
|
||
|
for x in tree(lst, size*sizefactor, level-1, widthfactor, brs,
|
||
|
angledist, sizedist):
|
||
|
yield None
|
||
|
|
||
|
|
||
|
def start(t,x,y):
|
||
|
colormode(255)
|
||
|
t.reset()
|
||
|
t.speed(0)
|
||
|
t.hideturtle()
|
||
|
t.left(90)
|
||
|
t.penup()
|
||
|
t.setpos(x,y)
|
||
|
t.pendown()
|
||
|
|
||
|
def doit1(level, pen):
|
||
|
pen.hideturtle()
|
||
|
start(pen, 20, -208)
|
||
|
t = tree( [pen], 80, level, 0.1, [[ (45,0.69), (0,0.65), (-45,0.71) ]] )
|
||
|
return t
|
||
|
|
||
|
def doit2(level, pen):
|
||
|
pen.hideturtle()
|
||
|
start(pen, -135, -130)
|
||
|
t = tree( [pen], 120, level, 0.1, [[ (45,0.69), (-45,0.71) ]] )
|
||
|
return t
|
||
|
|
||
|
def doit3(level, pen):
|
||
|
pen.hideturtle()
|
||
|
start(pen, 190, -90)
|
||
|
t = tree( [pen], 100, level, 0.1, [[ (45,0.7), (0,0.72), (-45,0.65) ]] )
|
||
|
return t
|
||
|
|
||
|
# Hier 3 Baumgeneratoren:
|
||
|
def main():
|
||
|
p = Turtle()
|
||
|
p.ht()
|
||
|
tracer(75,0)
|
||
|
u = doit1(6, Turtle(undobuffersize=1))
|
||
|
s = doit2(7, Turtle(undobuffersize=1))
|
||
|
t = doit3(5, Turtle(undobuffersize=1))
|
||
|
a = clock()
|
||
|
while True:
|
||
|
done = 0
|
||
|
for b in u,s,t:
|
||
|
try:
|
||
|
b.__next__()
|
||
|
except:
|
||
|
done += 1
|
||
|
if done == 3:
|
||
|
break
|
||
|
|
||
|
tracer(1,10)
|
||
|
b = clock()
|
||
|
return "runtime: %.2f sec." % (b-a)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|
||
|
mainloop()
|