1#!/usr/bin/env python3
2"""      turtle-example-suite:
3
4             tdemo_tree.py
5
6Displays a 'breadth-first-tree' - in contrast
7to the classical Logo tree drawing programs,
8which use a depth-first-algorithm.
9
10Uses:
11(1) a tree-generator, where the drawing is
12quasi the side-effect, whereas the generator
13always yields None.
14(2) Turtle-cloning: At each branching point
15the current pen is cloned. So in the end
16there are 1024 turtles.
17"""
18from turtle import Turtle, mainloop
19from time import clock
20
21def 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
39def 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    print(len(p.getscreen().turtles()))
53
54def main():
55    a=clock()
56    maketree()
57    b=clock()
58    return "done: %.2f sec." % (b-a)
59
60if __name__ == "__main__":
61    msg = main()
62    print(msg)
63    mainloop()
64