mirror of https://github.com/python/cpython
159 lines
4.1 KiB
Python
159 lines
4.1 KiB
Python
"""turtledemo/bytedesign.py
|
|
|
|
An example adapted from the example-suite
|
|
of PythonCard's turtle graphics.
|
|
|
|
It's based on an article in BYTE magazine
|
|
Problem Solving with Logo: Using Turtle
|
|
Graphics to Redraw a Design
|
|
November 1982, p. 118 - 134
|
|
|
|
-------------------------------------------
|
|
|
|
Due to the statement
|
|
|
|
t.delay(0)
|
|
|
|
in line 152, which sets the animation delay
|
|
to 0, this animation runs in "line per line"
|
|
mode as fast as possible.
|
|
"""
|
|
|
|
from turtle import Turtle, mainloop
|
|
from time import perf_counter as clock
|
|
|
|
# wrapper for any additional drawing routines
|
|
# that need to know about each other
|
|
class Designer(Turtle):
|
|
|
|
def design(self, homePos, scale):
|
|
self.up()
|
|
for i in range(5):
|
|
self.forward(64.65 * scale)
|
|
self.down()
|
|
self.wheel(self.position(), scale)
|
|
self.up()
|
|
self.backward(64.65 * scale)
|
|
self.right(72)
|
|
self.up()
|
|
self.goto(homePos)
|
|
self.right(36)
|
|
self.forward(24.5 * scale)
|
|
self.right(198)
|
|
self.down()
|
|
self.centerpiece(46 * scale, 143.4, scale)
|
|
self.getscreen().tracer(True)
|
|
|
|
def wheel(self, initpos, scale):
|
|
self.right(54)
|
|
for i in range(4):
|
|
self.pentpiece(initpos, scale)
|
|
self.down()
|
|
self.left(36)
|
|
for i in range(5):
|
|
self.tripiece(initpos, scale)
|
|
self.left(36)
|
|
for i in range(5):
|
|
self.down()
|
|
self.right(72)
|
|
self.forward(28 * scale)
|
|
self.up()
|
|
self.backward(28 * scale)
|
|
self.left(54)
|
|
self.getscreen().update()
|
|
|
|
def tripiece(self, initpos, scale):
|
|
oldh = self.heading()
|
|
self.down()
|
|
self.backward(2.5 * scale)
|
|
self.tripolyr(31.5 * scale, scale)
|
|
self.up()
|
|
self.goto(initpos)
|
|
self.setheading(oldh)
|
|
self.down()
|
|
self.backward(2.5 * scale)
|
|
self.tripolyl(31.5 * scale, scale)
|
|
self.up()
|
|
self.goto(initpos)
|
|
self.setheading(oldh)
|
|
self.left(72)
|
|
self.getscreen().update()
|
|
|
|
def pentpiece(self, initpos, scale):
|
|
oldh = self.heading()
|
|
self.up()
|
|
self.forward(29 * scale)
|
|
self.down()
|
|
for i in range(5):
|
|
self.forward(18 * scale)
|
|
self.right(72)
|
|
self.pentr(18 * scale, 75, scale)
|
|
self.up()
|
|
self.goto(initpos)
|
|
self.setheading(oldh)
|
|
self.forward(29 * scale)
|
|
self.down()
|
|
for i in range(5):
|
|
self.forward(18 * scale)
|
|
self.right(72)
|
|
self.pentl(18 * scale, 75, scale)
|
|
self.up()
|
|
self.goto(initpos)
|
|
self.setheading(oldh)
|
|
self.left(72)
|
|
self.getscreen().update()
|
|
|
|
def pentl(self, side, ang, scale):
|
|
if side < (2 * scale): return
|
|
self.forward(side)
|
|
self.left(ang)
|
|
self.pentl(side - (.38 * scale), ang, scale)
|
|
|
|
def pentr(self, side, ang, scale):
|
|
if side < (2 * scale): return
|
|
self.forward(side)
|
|
self.right(ang)
|
|
self.pentr(side - (.38 * scale), ang, scale)
|
|
|
|
def tripolyr(self, side, scale):
|
|
if side < (4 * scale): return
|
|
self.forward(side)
|
|
self.right(111)
|
|
self.forward(side / 1.78)
|
|
self.right(111)
|
|
self.forward(side / 1.3)
|
|
self.right(146)
|
|
self.tripolyr(side * .75, scale)
|
|
|
|
def tripolyl(self, side, scale):
|
|
if side < (4 * scale): return
|
|
self.forward(side)
|
|
self.left(111)
|
|
self.forward(side / 1.78)
|
|
self.left(111)
|
|
self.forward(side / 1.3)
|
|
self.left(146)
|
|
self.tripolyl(side * .75, scale)
|
|
|
|
def centerpiece(self, s, a, scale):
|
|
self.forward(s); self.left(a)
|
|
if s < (7.5 * scale):
|
|
return
|
|
self.centerpiece(s - (1.2 * scale), a, scale)
|
|
|
|
def main():
|
|
t = Designer()
|
|
t.speed(0)
|
|
t.hideturtle()
|
|
t.getscreen().delay(0)
|
|
t.getscreen().tracer(0)
|
|
at = clock()
|
|
t.design(t.position(), 2)
|
|
et = clock()
|
|
return "runtime: %.2f sec." % (et-at)
|
|
|
|
if __name__ == '__main__':
|
|
msg = main()
|
|
print(msg)
|
|
mainloop()
|