| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | """       xturtle-example-suite:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           xtx_kites_and_darts.py | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Constructs two aperiodic penrose-tilings, | 
					
						
							|  |  |  | consisting of kites and darts, by the method | 
					
						
							|  |  |  | of inflation in six steps. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Starting points are the patterns "sun" | 
					
						
							|  |  |  | consisting of five kites and "star" | 
					
						
							|  |  |  | consisting of five darts. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For more information see: | 
					
						
							|  |  |  |  http://en.wikipedia.org/wiki/Penrose_tiling | 
					
						
							|  |  |  |  ------------------------------------------- | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2008-09-21 07:32:10 +00:00
										 |  |  | from turtle import * | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | from math import cos, pi | 
					
						
							| 
									
										
										
										
											2017-10-17 14:46:45 -07:00
										 |  |  | from time import perf_counter as clock, sleep | 
					
						
							| 
									
										
										
										
											2008-06-10 04:44:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | f = (5**0.5-1)/2.0   # (sqrt(5)-1)/2 -- golden ratio | 
					
						
							|  |  |  | d = 2 * cos(3*pi/10) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def kite(l): | 
					
						
							|  |  |  |     fl = f * l | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(108) | 
					
						
							|  |  |  |     fd(fl) | 
					
						
							|  |  |  |     rt(36) | 
					
						
							|  |  |  |     fd(fl) | 
					
						
							|  |  |  |     rt(108) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(144) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def dart(l): | 
					
						
							|  |  |  |     fl = f * l | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(144) | 
					
						
							|  |  |  |     fd(fl) | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  |     fd(fl) | 
					
						
							|  |  |  |     rt(144) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(144) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def inflatekite(l, n): | 
					
						
							|  |  |  |     if n == 0: | 
					
						
							|  |  |  |         px, py = pos() | 
					
						
							|  |  |  |         h, x, y = int(heading()), round(px,3), round(py,3) | 
					
						
							|  |  |  |         tiledict[(h,x,y)] = True | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fl = f * l | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  |     inflatedart(fl, n-1) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(144) | 
					
						
							|  |  |  |     inflatekite(fl, n-1) | 
					
						
							|  |  |  |     lt(18) | 
					
						
							|  |  |  |     fd(l*d) | 
					
						
							|  |  |  |     rt(162) | 
					
						
							|  |  |  |     inflatekite(fl, n-1) | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(180) | 
					
						
							|  |  |  |     inflatedart(fl, n-1) | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def inflatedart(l, n): | 
					
						
							|  |  |  |     if n == 0: | 
					
						
							|  |  |  |         px, py = pos() | 
					
						
							|  |  |  |         h, x, y = int(heading()), round(px,3), round(py,3) | 
					
						
							|  |  |  |         tiledict[(h,x,y)] = False | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fl = f * l | 
					
						
							|  |  |  |     inflatekite(fl, n-1) | 
					
						
							|  |  |  |     lt(36) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(180) | 
					
						
							|  |  |  |     inflatedart(fl, n-1) | 
					
						
							|  |  |  |     lt(54) | 
					
						
							|  |  |  |     fd(l*d) | 
					
						
							|  |  |  |     rt(126) | 
					
						
							|  |  |  |     inflatedart(fl, n-1) | 
					
						
							|  |  |  |     fd(l) | 
					
						
							|  |  |  |     rt(144) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def draw(l, n, th=2): | 
					
						
							|  |  |  |     clear() | 
					
						
							|  |  |  |     l = l * f**n | 
					
						
							|  |  |  |     shapesize(l/100.0, l/100.0, th) | 
					
						
							|  |  |  |     for k in tiledict: | 
					
						
							|  |  |  |         h, x, y = k | 
					
						
							|  |  |  |         setpos(x, y) | 
					
						
							|  |  |  |         setheading(h) | 
					
						
							|  |  |  |         if tiledict[k]: | 
					
						
							|  |  |  |             shape("kite") | 
					
						
							|  |  |  |             color("black", (0, 0.75, 0)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             shape("dart") | 
					
						
							|  |  |  |             color("black", (0.75, 0, 0)) | 
					
						
							|  |  |  |         stamp() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def sun(l, n): | 
					
						
							|  |  |  |     for i in range(5): | 
					
						
							|  |  |  |         inflatekite(l, n) | 
					
						
							|  |  |  |         lt(72) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def star(l,n): | 
					
						
							|  |  |  |     for i in range(5): | 
					
						
							|  |  |  |         inflatedart(l, n) | 
					
						
							|  |  |  |         lt(72) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def makeshapes(): | 
					
						
							|  |  |  |     tracer(0) | 
					
						
							|  |  |  |     begin_poly() | 
					
						
							|  |  |  |     kite(100) | 
					
						
							|  |  |  |     end_poly() | 
					
						
							|  |  |  |     register_shape("kite", get_poly()) | 
					
						
							|  |  |  |     begin_poly() | 
					
						
							|  |  |  |     dart(100) | 
					
						
							|  |  |  |     end_poly() | 
					
						
							|  |  |  |     register_shape("dart", get_poly()) | 
					
						
							|  |  |  |     tracer(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def start(): | 
					
						
							|  |  |  |     reset() | 
					
						
							|  |  |  |     ht() | 
					
						
							|  |  |  |     pu() | 
					
						
							|  |  |  |     makeshapes() | 
					
						
							|  |  |  |     resizemode("user") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(l=200, n=4, fun=sun, startpos=(0,0), th=2): | 
					
						
							|  |  |  |     global tiledict | 
					
						
							|  |  |  |     goto(startpos) | 
					
						
							|  |  |  |     setheading(0) | 
					
						
							|  |  |  |     tiledict = {} | 
					
						
							|  |  |  |     tracer(0) | 
					
						
							|  |  |  |     fun(l, n) | 
					
						
							|  |  |  |     draw(l, n, th) | 
					
						
							|  |  |  |     tracer(1) | 
					
						
							|  |  |  |     nk = len([x for x in tiledict if tiledict[x]]) | 
					
						
							|  |  |  |     nd = len([x for x in tiledict if not tiledict[x]]) | 
					
						
							|  |  |  |     print("%d kites and %d darts = %d pieces." % (nk, nd, nk+nd)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def demo(fun=sun): | 
					
						
							|  |  |  |     start() | 
					
						
							|  |  |  |     for i in range(8): | 
					
						
							|  |  |  |         a = clock() | 
					
						
							|  |  |  |         test(300, i, fun) | 
					
						
							|  |  |  |         b = clock() | 
					
						
							|  |  |  |         t = b - a | 
					
						
							|  |  |  |         if t < 2: | 
					
						
							|  |  |  |             sleep(2 - t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     #title("Penrose-tiling with kites and darts.") | 
					
						
							|  |  |  |     mode("logo") | 
					
						
							|  |  |  |     bgcolor(0.3, 0.3, 0) | 
					
						
							|  |  |  |     demo(sun) | 
					
						
							|  |  |  |     sleep(2) | 
					
						
							|  |  |  |     demo(star) | 
					
						
							|  |  |  |     pencolor("black") | 
					
						
							|  |  |  |     goto(0,-200) | 
					
						
							|  |  |  |     pencolor(0.7,0.7,1) | 
					
						
							|  |  |  |     write("Please wait...", | 
					
						
							|  |  |  |           align="center", font=('Arial Black', 36, 'bold')) | 
					
						
							|  |  |  |     test(600, 8, startpos=(70, 117)) | 
					
						
							|  |  |  |     return "Done" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     msg = main() | 
					
						
							|  |  |  |     mainloop() |