1#!/usr/local/bin/python3.7
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