Mercurial > repos > rliterman > csp2
comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/turtledemo/penrose.py @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:0e9998148a16 | 68:5028fdace37b |
---|---|
1 #!/usr/bin/env python3 | |
2 """ xturtle-example-suite: | |
3 | |
4 xtx_kites_and_darts.py | |
5 | |
6 Constructs two aperiodic penrose-tilings, | |
7 consisting of kites and darts, by the method | |
8 of inflation in six steps. | |
9 | |
10 Starting points are the patterns "sun" | |
11 consisting of five kites and "star" | |
12 consisting of five darts. | |
13 | |
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 perf_counter as clock, sleep | |
21 | |
22 f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio | |
23 d = 2 * cos(3*pi/10) | |
24 | |
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) | |
36 | |
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) | |
48 | |
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) | |
70 | |
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) | |
89 | |
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() | |
105 | |
106 def sun(l, n): | |
107 for i in range(5): | |
108 inflatekite(l, n) | |
109 lt(72) | |
110 | |
111 def star(l,n): | |
112 for i in range(5): | |
113 inflatedart(l, n) | |
114 lt(72) | |
115 | |
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) | |
127 | |
128 def start(): | |
129 reset() | |
130 ht() | |
131 pu() | |
132 makeshapes() | |
133 resizemode("user") | |
134 | |
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 tracer(0) | |
141 fun(l, n) | |
142 draw(l, n, th) | |
143 tracer(1) | |
144 nk = len([x for x in tiledict if tiledict[x]]) | |
145 nd = len([x for x in tiledict if not tiledict[x]]) | |
146 print("%d kites and %d darts = %d pieces." % (nk, nd, nk+nd)) | |
147 | |
148 def demo(fun=sun): | |
149 start() | |
150 for i in range(8): | |
151 a = clock() | |
152 test(300, i, fun) | |
153 b = clock() | |
154 t = b - a | |
155 if t < 2: | |
156 sleep(2 - t) | |
157 | |
158 def main(): | |
159 #title("Penrose-tiling with kites and darts.") | |
160 mode("logo") | |
161 bgcolor(0.3, 0.3, 0) | |
162 demo(sun) | |
163 sleep(2) | |
164 demo(star) | |
165 pencolor("black") | |
166 goto(0,-200) | |
167 pencolor(0.7,0.7,1) | |
168 write("Please wait...", | |
169 align="center", font=('Arial Black', 36, 'bold')) | |
170 test(600, 8, startpos=(70, 117)) | |
171 return "Done" | |
172 | |
173 if __name__ == "__main__": | |
174 msg = main() | |
175 mainloop() |