mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			181 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python
 | |
| """       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
 | |
|  -------------------------------------------
 | |
| """
 | |
| from turtle import *
 | |
| from math import cos, pi
 | |
| from time import clock, sleep
 | |
| 
 | |
| 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 = {}
 | |
|     a = clock()
 | |
|     tracer(0)
 | |
|     fun(l, n)
 | |
|     b = clock()
 | |
|     draw(l, n, th)
 | |
|     tracer(1)
 | |
|     c = clock()
 | |
|     print("Calculation:   %7.4f s" % (b - a))
 | |
|     print("Drawing:  %7.4f s" % (c - b))
 | |
|     print("Together: %7.4f s" % (c - a))
 | |
|     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()
 | 
