| #!/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 |
| print(len(p.getscreen().turtles())) |
| |
| def main(): |
| a=clock() |
| maketree() |
| b=clock() |
| return "done: %.2f sec." % (b-a) |
| |
| if __name__ == "__main__": |
| msg = main() |
| print(msg) |
| mainloop() |