| #!/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. | 
 | """ | 
 |  | 
 | import math | 
 | from turtle import Turtle, mainloop | 
 | from time import 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() |