• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2"""      turtle-example-suite:
3
4        tdemo_bytedesign.py
5
6An example adapted from the example-suite
7of PythonCard's turtle graphcis.
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
25import math
26from turtle import Turtle, mainloop
27from 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.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.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()
163