Home | History | Annotate | Download | only in turtledemo
      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 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     print(len(p.getscreen().turtles()))
     53 
     54 def main():
     55     a=clock()
     56     maketree()
     57     b=clock()
     58     return "done: %.2f sec." % (b-a)
     59 
     60 if __name__ == "__main__":
     61     msg = main()
     62     print(msg)
     63     mainloop()
     64