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