| #!/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() |