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()