Spaces:
Running
Running
#!/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() | |