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