| #!/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() |