123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #!/usr/bin/env python3
- """ 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()
|