This should finally fix #6896. Let's watch the buildbots.
[python.git] / Demo / turtle / tdemo_penrose.py
blob4d8a61ee88e22525e804765036b6004cf862bfce
1 #!/usr/bin/python
2 """ xturtle-example-suite:
4 xtx_kites_and_darts.py
6 Constructs two aperiodic penrose-tilings,
7 consisting of kites and darts, by the method
8 of inflation in six steps.
10 Starting points are the patterns "sun"
11 consisting of five kites and "star"
12 consisting of five darts.
14 For more information see:
15 http://en.wikipedia.org/wiki/Penrose_tiling
16 -------------------------------------------
17 """
18 from turtle import *
19 from math import cos, pi
20 from time import clock, sleep
22 f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio
23 d = 2 * cos(3*pi/10)
25 def kite(l):
26 fl = f * l
27 lt(36)
28 fd(l)
29 rt(108)
30 fd(fl)
31 rt(36)
32 fd(fl)
33 rt(108)
34 fd(l)
35 rt(144)
37 def dart(l):
38 fl = f * l
39 lt(36)
40 fd(l)
41 rt(144)
42 fd(fl)
43 lt(36)
44 fd(fl)
45 rt(144)
46 fd(l)
47 rt(144)
49 def inflatekite(l, n):
50 if n == 0:
51 px, py = pos()
52 h, x, y = int(heading()), round(px,3), round(py,3)
53 tiledict[(h,x,y)] = True
54 return
55 fl = f * l
56 lt(36)
57 inflatedart(fl, n-1)
58 fd(l)
59 rt(144)
60 inflatekite(fl, n-1)
61 lt(18)
62 fd(l*d)
63 rt(162)
64 inflatekite(fl, n-1)
65 lt(36)
66 fd(l)
67 rt(180)
68 inflatedart(fl, n-1)
69 lt(36)
71 def inflatedart(l, n):
72 if n == 0:
73 px, py = pos()
74 h, x, y = int(heading()), round(px,3), round(py,3)
75 tiledict[(h,x,y)] = False
76 return
77 fl = f * l
78 inflatekite(fl, n-1)
79 lt(36)
80 fd(l)
81 rt(180)
82 inflatedart(fl, n-1)
83 lt(54)
84 fd(l*d)
85 rt(126)
86 inflatedart(fl, n-1)
87 fd(l)
88 rt(144)
90 def draw(l, n, th=2):
91 clear()
92 l = l * f**n
93 shapesize(l/100.0, l/100.0, th)
94 for k in tiledict:
95 h, x, y = k
96 setpos(x, y)
97 setheading(h)
98 if tiledict[k]:
99 shape("kite")
100 color("black", (0, 0.75, 0))
101 else:
102 shape("dart")
103 color("black", (0.75, 0, 0))
104 stamp()
106 def sun(l, n):
107 for i in range(5):
108 inflatekite(l, n)
109 lt(72)
111 def star(l,n):
112 for i in range(5):
113 inflatedart(l, n)
114 lt(72)
116 def makeshapes():
117 tracer(0)
118 begin_poly()
119 kite(100)
120 end_poly()
121 register_shape("kite", get_poly())
122 begin_poly()
123 dart(100)
124 end_poly()
125 register_shape("dart", get_poly())
126 tracer(1)
128 def start():
129 reset()
130 ht()
131 pu()
132 makeshapes()
133 resizemode("user")
135 def test(l=200, n=4, fun=sun, startpos=(0,0), th=2):
136 global tiledict
137 goto(startpos)
138 setheading(0)
139 tiledict = {}
140 a = clock()
141 tracer(0)
142 fun(l, n)
143 b = clock()
144 draw(l, n, th)
145 tracer(1)
146 c = clock()
147 print "Calculation: %7.4f s" % (b - a)
148 print "Drawing: %7.4f s" % (c - b)
149 print "Together: %7.4f s" % (c - a)
150 nk = len([x for x in tiledict if tiledict[x]])
151 nd = len([x for x in tiledict if not tiledict[x]])
152 print "%d kites and %d darts = %d pieces." % (nk, nd, nk+nd)
154 def demo(fun=sun):
155 start()
156 for i in range(8):
157 a = clock()
158 test(300, i, fun)
159 b = clock()
160 t = b - a
161 if t < 2:
162 sleep(2 - t)
164 def main():
165 #title("Penrose-tiling with kites and darts.")
166 mode("logo")
167 bgcolor(0.3, 0.3, 0)
168 demo(sun)
169 sleep(2)
170 demo(star)
171 pencolor("black")
172 goto(0,-200)
173 pencolor(0.7,0.7,1)
174 write("Please wait...",
175 align="center", font=('Arial Black', 36, 'bold'))
176 test(600, 8, startpos=(70, 117))
177 return "Done"
179 if __name__ == "__main__":
180 msg = main()
181 mainloop()