blob: 7fe080e6333a539ba2bf7d13851c53e7138a2dee [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Martin v. Löwis97cf99f2008-06-10 04:44:07 +00002""" turtlegraphics-example-suite:
3
4 tdemo_forest.py
5
Terry Jan Reedyc5a72e62014-06-24 22:21:41 -04006Displays a 'forest' of 3 breadth-first-trees
7similar to the one in tree.
8For further remarks see tree.py
Martin v. Löwis97cf99f2008-06-10 04:44:07 +00009
10This example is a 'breadth-first'-rewrite of
Terry Jan Reedyc5a72e62014-06-24 22:21:41 -040011a Logo program written by Erich Neuwirth. See
Martin v. Löwis97cf99f2008-06-10 04:44:07 +000012http://homepage.univie.ac.at/erich.neuwirth/
13"""
Martin v. Löwis60ebb8b2008-09-21 07:32:10 +000014from turtle import Turtle, colormode, tracer, mainloop
Martin v. Löwis97cf99f2008-06-10 04:44:07 +000015from random import randrange
16from time import clock
17
18def symRandom(n):
19 return randrange(-n,n+1)
20
21def randomize( branchlist, angledist, sizedist ):
22 return [ (angle+symRandom(angledist),
23 sizefactor*1.01**symRandom(sizedist))
24 for angle, sizefactor in branchlist ]
25
26def randomfd( t, distance, parts, angledist ):
27 for i in range(parts):
28 t.left(symRandom(angledist))
29 t.forward( (1.0 * distance)/parts )
30
31def tree(tlist, size, level, widthfactor, branchlists, angledist=10, sizedist=5):
32 # benutzt Liste von turtles und Liste von Zweiglisten,
33 # fuer jede turtle eine!
34 if level > 0:
35 lst = []
36 brs = []
37 for t, branchlist in list(zip(tlist,branchlists)):
38 t.pensize( size * widthfactor )
39 t.pencolor( 255 - (180 - 11 * level + symRandom(15)),
40 180 - 11 * level + symRandom(15),
41 0 )
42 t.pendown()
43 randomfd(t, size, level, angledist )
44 yield 1
45 for angle, sizefactor in branchlist:
46 t.left(angle)
47 lst.append(t.clone())
48 brs.append(randomize(branchlist, angledist, sizedist))
49 t.right(angle)
50 for x in tree(lst, size*sizefactor, level-1, widthfactor, brs,
51 angledist, sizedist):
52 yield None
53
54
55def start(t,x,y):
56 colormode(255)
57 t.reset()
58 t.speed(0)
59 t.hideturtle()
60 t.left(90)
61 t.penup()
62 t.setpos(x,y)
63 t.pendown()
64
65def doit1(level, pen):
66 pen.hideturtle()
67 start(pen, 20, -208)
68 t = tree( [pen], 80, level, 0.1, [[ (45,0.69), (0,0.65), (-45,0.71) ]] )
69 return t
70
71def doit2(level, pen):
72 pen.hideturtle()
73 start(pen, -135, -130)
74 t = tree( [pen], 120, level, 0.1, [[ (45,0.69), (-45,0.71) ]] )
75 return t
76
77def doit3(level, pen):
78 pen.hideturtle()
79 start(pen, 190, -90)
80 t = tree( [pen], 100, level, 0.1, [[ (45,0.7), (0,0.72), (-45,0.65) ]] )
81 return t
82
83# Hier 3 Baumgeneratoren:
84def main():
85 p = Turtle()
86 p.ht()
87 tracer(75,0)
88 u = doit1(6, Turtle(undobuffersize=1))
89 s = doit2(7, Turtle(undobuffersize=1))
90 t = doit3(5, Turtle(undobuffersize=1))
91 a = clock()
92 while True:
93 done = 0
94 for b in u,s,t:
95 try:
96 b.__next__()
97 except:
98 done += 1
99 if done == 3:
100 break
101
102 tracer(1,10)
103 b = clock()
104 return "runtime: %.2f sec." % (b-a)
105
106if __name__ == '__main__':
Terry Jan Reedyc5a72e62014-06-24 22:21:41 -0400107 main()
Martin v. Löwis97cf99f2008-06-10 04:44:07 +0000108 mainloop()