1 #!/usr/bin/env python3
2 """ turtle-example-suite:
3
4 tdemo_tree.py
5
6 Displays a 'breadth-first-tree' - in contrast
7 to the classical Logo tree drawing programs,
8 which use a depth-first-algorithm.
9
10 Uses:
11 (1) a tree-generator, where the drawing is
12 quasi the side-effect, whereas the generator
13 always yields None.
14 (2) Turtle-cloning: At each branching point
15 the current pen is cloned. So in the end
16 there are 1024 turtles.
17 """
18 from turtle import Turtle, mainloop
19 from time import perf_counter as clock
20
21 def tree(plist, l, a, f):
22 """ plist is list of pens
23 l is length of branch
24 a is half of the angle between 2 branches
25 f is factor by which branch is shortened
26 from level to level."""
27 if l > 3:
28 lst = []
29 for p in plist:
30 p.forward(l)
31 q = p.clone()
32 p.left(a)
33 q.right(a)
34 lst.append(p)
35 lst.append(q)
36 for x in tree(lst, l*f, a, f):
37 yield None
38
39 def maketree():
40 p = Turtle()
41 p.setundobuffer(None)
42 p.hideturtle()
43 p.speed(0)
44 p.getscreen().tracer(30,0)
45 p.left(90)
46 p.penup()
47 p.forward(-210)
48 p.pendown()
49 t = tree([p], 200, 65, 0.6375)
50 for x in t:
51 pass
52
53 def main():
54 a=clock()
55 maketree()
56 b=clock()
57 return "done: %.2f sec." % (b-a)
58
59 if __name__ == "__main__":
60 msg = main()
61 print(msg)
62 mainloop()