mirror of
https://github.com/python/cpython.git
synced 2024-11-30 18:51:15 +01:00
c8b45a385a
* gh-118673: Remove shebang and executable bits from stdlib modules. * Removed shebangs and exe bits on turtledemo scripts. The setting was inappropriate for '__main__' and inconsistent across the other modules. The scripts can still be executed directly by invoking with the desired interpreter.
161 lines
4.1 KiB
Python
161 lines
4.1 KiB
Python
""" turtle-example-suite:
|
|
|
|
tdemo_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()
|