|
|
|
""" 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() |
|
|