1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #!/usr/bin/env python3
- """ turtle-example-suite:
- tdemo_tree.py
- Displays a 'breadth-first-tree' - in contrast
- to the classical Logo tree drawing programs,
- which use a depth-first-algorithm.
- Uses:
- (1) a tree-generator, where the drawing is
- quasi the side-effect, whereas the generator
- always yields None.
- (2) Turtle-cloning: At each branching point
- the current pen is cloned. So in the end
- there are 1024 turtles.
- """
- from turtle import Turtle, mainloop
- from time import perf_counter as clock
- def tree(plist, l, a, f):
- """ plist is list of pens
- l is length of branch
- a is half of the angle between 2 branches
- f is factor by which branch is shortened
- from level to level."""
- if l > 3:
- lst = []
- for p in plist:
- p.forward(l)
- q = p.clone()
- p.left(a)
- q.right(a)
- lst.append(p)
- lst.append(q)
- for x in tree(lst, l*f, a, f):
- yield None
- def maketree():
- p = Turtle()
- p.setundobuffer(None)
- p.hideturtle()
- p.speed(0)
- p.getscreen().tracer(30,0)
- p.left(90)
- p.penup()
- p.forward(-210)
- p.pendown()
- t = tree([p], 200, 65, 0.6375)
- for x in t:
- pass
- def main():
- a=clock()
- maketree()
- b=clock()
- return "done: %.2f sec." % (b-a)
- if __name__ == "__main__":
- msg = main()
- print(msg)
- mainloop()
|