blob: f73c864b7b40a247028a17474ecec1f2a772aefc [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""" xturtle-example-suite:
3
4 xtx_kites_and_darts.py
5
6Constructs two aperiodic penrose-tilings,
7consisting of kites and darts, by the method
8of inflation in six steps.
9
10Starting points are the patterns "sun"
11consisting of five kites and "star"
12consisting of five darts.
13
14For more information see:
15 http://en.wikipedia.org/wiki/Penrose_tiling
16 -------------------------------------------
17"""
Martin v. Löwis60ebb8b2008-09-21 07:32:10 +000018from turtle import *
Martin v. Löwis97cf99f2008-06-10 04:44:07 +000019from math import cos, pi
20from time import clock, sleep
21
22f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio
23d = 2 * cos(3*pi/10)
24
25def 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)
36
37def 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)
48
49def 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)
70
71def 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)
89
90def 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()
105
106def sun(l, n):
107 for i in range(5):
108 inflatekite(l, n)
109 lt(72)
110
111def star(l,n):
112 for i in range(5):
113 inflatedart(l, n)
114 lt(72)
115
116def 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)
127
128def start():
129 reset()
130 ht()
131 pu()
132 makeshapes()
133 resizemode("user")
134
135def 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))
153
154def 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)
163
164def 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"
178
179if __name__ == "__main__":
180 msg = main()
181 mainloop()