annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/turtledemo/bytedesign.py @ 69:33d812a61356

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