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