123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- #!/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 perf_counter as 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 = {}
- 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()
|