| #!/usr/bin/env python3 |
| """ turtlegraphics-example-suite: |
| |
| tdemo_forest.py |
| |
| Displays a 'forest' of 3 'breadth-first-trees' |
| similar to the one from example tree. |
| For further remarks see xtx_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 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__': |
| msg = main() |
| print(msg) |
| mainloop() |