blob: 64b1d7d5b0327f708918749e9dc37675b4c80da8 [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
25import math
Martin v. Löwis60ebb8b2008-09-21 07:32:10 +000026from turtle import Turtle, mainloop
Martin v. Löwis97cf99f2008-06-10 04:44:07 +000027from time import clock
28
29# wrapper for any additional drawing routines
30# that need to know about each other
31class Designer(Turtle):
32
33 def design(self, homePos, scale):
34 self.up()
35 for i in range(5):
36 self.forward(64.65 * scale)
37 self.down()
38 self.wheel(self.position(), scale)
39 self.up()
40 self.backward(64.65 * scale)
41 self.right(72)
42 self.up()
43 self.goto(homePos)
44 self.right(36)
45 self.forward(24.5 * scale)
46 self.right(198)
47 self.down()
48 self.centerpiece(46 * scale, 143.4, scale)
49 self.getscreen().tracer(True)
50
51 def wheel(self, initpos, scale):
52 self.right(54)
53 for i in range(4):
54 self.pentpiece(initpos, scale)
55 self.down()
56 self.left(36)
57 for i in range(5):
58 self.tripiece(initpos, scale)
59 self.left(36)
60 for i in range(5):
61 self.down()
62 self.right(72)
63 self.forward(28 * scale)
64 self.up()
65 self.backward(28 * scale)
66 self.left(54)
67 self.getscreen().update()
68
69 def tripiece(self, initpos, scale):
70 oldh = self.heading()
71 self.down()
72 self.backward(2.5 * scale)
73 self.tripolyr(31.5 * scale, scale)
74 self.up()
75 self.goto(initpos)
76 self.setheading(oldh)
77 self.down()
78 self.backward(2.5 * scale)
79 self.tripolyl(31.5 * scale, scale)
80 self.up()
81 self.goto(initpos)
82 self.setheading(oldh)
83 self.left(72)
84 self.getscreen().update()
85
86 def pentpiece(self, initpos, scale):
87 oldh = self.heading()
88 self.up()
89 self.forward(29 * scale)
90 self.down()
91 for i in range(5):
92 self.forward(18 * scale)
93 self.right(72)
94 self.pentr(18 * scale, 75, scale)
95 self.up()
96 self.goto(initpos)
97 self.setheading(oldh)
98 self.forward(29 * scale)
99 self.down()
100 for i in range(5):
101 self.forward(18 * scale)
102 self.right(72)
103 self.pentl(18 * scale, 75, scale)
104 self.up()
105 self.goto(initpos)
106 self.setheading(oldh)
107 self.left(72)
108 self.getscreen().update()
109
110 def pentl(self, side, ang, scale):
111 if side < (2 * scale): return
112 self.forward(side)
113 self.left(ang)
114 self.pentl(side - (.38 * scale), ang, scale)
115
116 def pentr(self, side, ang, scale):
117 if side < (2 * scale): return
118 self.forward(side)
119 self.right(ang)
120 self.pentr(side - (.38 * scale), ang, scale)
121
122 def tripolyr(self, side, scale):
123 if side < (4 * scale): return
124 self.forward(side)
125 self.right(111)
126 self.forward(side / 1.78)
127 self.right(111)
128 self.forward(side / 1.3)
129 self.right(146)
130 self.tripolyr(side * .75, scale)
131
132 def tripolyl(self, side, scale):
133 if side < (4 * scale): return
134 self.forward(side)
135 self.left(111)
136 self.forward(side / 1.78)
137 self.left(111)
138 self.forward(side / 1.3)
139 self.left(146)
140 self.tripolyl(side * .75, scale)
141
142 def centerpiece(self, s, a, scale):
143 self.forward(s); self.left(a)
144 if s < (7.5 * scale):
145 return
146 self.centerpiece(s - (1.2 * scale), a, scale)
147
148def main():
149 t = Designer()
150 t.speed(0)
151 t.hideturtle()
152 t.getscreen().delay(0)
153 t.getscreen().tracer(0)
154 at = clock()
155 t.design(t.position(), 2)
156 et = clock()
157 return "runtime: %.2f sec." % (et-at)
158
159if __name__ == '__main__':
160 msg = main()
161 print(msg)
162 mainloop()