mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			181 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
"""       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()
 |