blob: b3b095b76871af1d413a4e52d8601cbca85e0225 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Martin v. Löwis97cf99f2008-06-10 04:44:07 +00002""" turtle-example-suite:
3
4 tdemo_bytedesign.py
5
6An example adapted from the example-suite
Ezio Melotti13925002011-03-16 11:05:33 +02007of PythonCard's turtle graphics.
Martin v. Löwis97cf99f2008-06-10 04:44:07 +00008
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
Martin v. Löwis60ebb8b2008-09-21 07:32:10 +000025from turtle import Turtle, mainloop
Martin v. Löwis97cf99f2008-06-10 04:44:07 +000026from time import 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()