mirror of
https://github.com/python/cpython.git
synced 2024-11-28 08:20:55 +01:00
9c01db40aa
Co-authored-by: Wulian <xiguawulian@gmail.com> Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
60 lines
1.3 KiB
Python
60 lines
1.3 KiB
Python
"""turtledemo/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()
|