1#!/usr/bin/env python3 2""" turtle-example-suite: 3 4 tdemo_bytedesign.py 5 6An example adapted from the example-suite 7of PythonCard's turtle graphics. 8 9It's based on an article in BYTE magazine 10Problem Solving with Logo: Using Turtle 11Graphics to Redraw a Design 12November 1982, p. 118 - 134 13 14------------------------------------------- 15 16Due to the statement 17 18t.delay(0) 19 20in line 152, which sets the animation delay 21to 0, this animation runs in "line per line" 22mode as fast as possible. 23""" 24 25from turtle import Turtle, mainloop 26from time import perf_counter as clock 27 28# wrapper for any additional drawing routines 29# that need to know about each other 30class Designer(Turtle): 31 32 def design(self, homePos, scale): 33 self.up() 34 for i in range(5): 35 self.forward(64.65 * scale) 36 self.down() 37 self.wheel(self.position(), scale) 38 self.up() 39 self.backward(64.65 * scale) 40 self.right(72) 41 self.up() 42 self.goto(homePos) 43 self.right(36) 44 self.forward(24.5 * scale) 45 self.right(198) 46 self.down() 47 self.centerpiece(46 * scale, 143.4, scale) 48 self.getscreen().tracer(True) 49 50 def wheel(self, initpos, scale): 51 self.right(54) 52 for i in range(4): 53 self.pentpiece(initpos, scale) 54 self.down() 55 self.left(36) 56 for i in range(5): 57 self.tripiece(initpos, scale) 58 self.left(36) 59 for i in range(5): 60 self.down() 61 self.right(72) 62 self.forward(28 * scale) 63 self.up() 64 self.backward(28 * scale) 65 self.left(54) 66 self.getscreen().update() 67 68 def tripiece(self, initpos, scale): 69 oldh = self.heading() 70 self.down() 71 self.backward(2.5 * scale) 72 self.tripolyr(31.5 * scale, scale) 73 self.up() 74 self.goto(initpos) 75 self.setheading(oldh) 76 self.down() 77 self.backward(2.5 * scale) 78 self.tripolyl(31.5 * scale, scale) 79 self.up() 80 self.goto(initpos) 81 self.setheading(oldh) 82 self.left(72) 83 self.getscreen().update() 84 85 def pentpiece(self, initpos, scale): 86 oldh = self.heading() 87 self.up() 88 self.forward(29 * scale) 89 self.down() 90 for i in range(5): 91 self.forward(18 * scale) 92 self.right(72) 93 self.pentr(18 * scale, 75, scale) 94 self.up() 95 self.goto(initpos) 96 self.setheading(oldh) 97 self.forward(29 * scale) 98 self.down() 99 for i in range(5): 100 self.forward(18 * scale) 101 self.right(72) 102 self.pentl(18 * scale, 75, scale) 103 self.up() 104 self.goto(initpos) 105 self.setheading(oldh) 106 self.left(72) 107 self.getscreen().update() 108 109 def pentl(self, side, ang, scale): 110 if side < (2 * scale): return 111 self.forward(side) 112 self.left(ang) 113 self.pentl(side - (.38 * scale), ang, scale) 114 115 def pentr(self, side, ang, scale): 116 if side < (2 * scale): return 117 self.forward(side) 118 self.right(ang) 119 self.pentr(side - (.38 * scale), ang, scale) 120 121 def tripolyr(self, side, scale): 122 if side < (4 * scale): return 123 self.forward(side) 124 self.right(111) 125 self.forward(side / 1.78) 126 self.right(111) 127 self.forward(side / 1.3) 128 self.right(146) 129 self.tripolyr(side * .75, scale) 130 131 def tripolyl(self, side, scale): 132 if side < (4 * scale): return 133 self.forward(side) 134 self.left(111) 135 self.forward(side / 1.78) 136 self.left(111) 137 self.forward(side / 1.3) 138 self.left(146) 139 self.tripolyl(side * .75, scale) 140 141 def centerpiece(self, s, a, scale): 142 self.forward(s); self.left(a) 143 if s < (7.5 * scale): 144 return 145 self.centerpiece(s - (1.2 * scale), a, scale) 146 147def main(): 148 t = Designer() 149 t.speed(0) 150 t.hideturtle() 151 t.getscreen().delay(0) 152 t.getscreen().tracer(0) 153 at = clock() 154 t.design(t.position(), 2) 155 et = clock() 156 return "runtime: %.2f sec." % (et-at) 157 158if __name__ == '__main__': 159 msg = main() 160 print(msg) 161 mainloop() 162