17db96d56Sopenharmony_ci#!/usr/bin/env python3 27db96d56Sopenharmony_ci""" xturtle-example-suite: 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci xtx_kites_and_darts.py 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ciConstructs two aperiodic penrose-tilings, 77db96d56Sopenharmony_ciconsisting of kites and darts, by the method 87db96d56Sopenharmony_ciof inflation in six steps. 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciStarting points are the patterns "sun" 117db96d56Sopenharmony_ciconsisting of five kites and "star" 127db96d56Sopenharmony_ciconsisting of five darts. 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciFor more information see: 157db96d56Sopenharmony_ci http://en.wikipedia.org/wiki/Penrose_tiling 167db96d56Sopenharmony_ci ------------------------------------------- 177db96d56Sopenharmony_ci""" 187db96d56Sopenharmony_cifrom turtle import * 197db96d56Sopenharmony_cifrom math import cos, pi 207db96d56Sopenharmony_cifrom time import perf_counter as clock, sleep 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_cif = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio 237db96d56Sopenharmony_cid = 2 * cos(3*pi/10) 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_cidef kite(l): 267db96d56Sopenharmony_ci fl = f * l 277db96d56Sopenharmony_ci lt(36) 287db96d56Sopenharmony_ci fd(l) 297db96d56Sopenharmony_ci rt(108) 307db96d56Sopenharmony_ci fd(fl) 317db96d56Sopenharmony_ci rt(36) 327db96d56Sopenharmony_ci fd(fl) 337db96d56Sopenharmony_ci rt(108) 347db96d56Sopenharmony_ci fd(l) 357db96d56Sopenharmony_ci rt(144) 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_cidef dart(l): 387db96d56Sopenharmony_ci fl = f * l 397db96d56Sopenharmony_ci lt(36) 407db96d56Sopenharmony_ci fd(l) 417db96d56Sopenharmony_ci rt(144) 427db96d56Sopenharmony_ci fd(fl) 437db96d56Sopenharmony_ci lt(36) 447db96d56Sopenharmony_ci fd(fl) 457db96d56Sopenharmony_ci rt(144) 467db96d56Sopenharmony_ci fd(l) 477db96d56Sopenharmony_ci rt(144) 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_cidef inflatekite(l, n): 507db96d56Sopenharmony_ci if n == 0: 517db96d56Sopenharmony_ci px, py = pos() 527db96d56Sopenharmony_ci h, x, y = int(heading()), round(px,3), round(py,3) 537db96d56Sopenharmony_ci tiledict[(h,x,y)] = True 547db96d56Sopenharmony_ci return 557db96d56Sopenharmony_ci fl = f * l 567db96d56Sopenharmony_ci lt(36) 577db96d56Sopenharmony_ci inflatedart(fl, n-1) 587db96d56Sopenharmony_ci fd(l) 597db96d56Sopenharmony_ci rt(144) 607db96d56Sopenharmony_ci inflatekite(fl, n-1) 617db96d56Sopenharmony_ci lt(18) 627db96d56Sopenharmony_ci fd(l*d) 637db96d56Sopenharmony_ci rt(162) 647db96d56Sopenharmony_ci inflatekite(fl, n-1) 657db96d56Sopenharmony_ci lt(36) 667db96d56Sopenharmony_ci fd(l) 677db96d56Sopenharmony_ci rt(180) 687db96d56Sopenharmony_ci inflatedart(fl, n-1) 697db96d56Sopenharmony_ci lt(36) 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_cidef inflatedart(l, n): 727db96d56Sopenharmony_ci if n == 0: 737db96d56Sopenharmony_ci px, py = pos() 747db96d56Sopenharmony_ci h, x, y = int(heading()), round(px,3), round(py,3) 757db96d56Sopenharmony_ci tiledict[(h,x,y)] = False 767db96d56Sopenharmony_ci return 777db96d56Sopenharmony_ci fl = f * l 787db96d56Sopenharmony_ci inflatekite(fl, n-1) 797db96d56Sopenharmony_ci lt(36) 807db96d56Sopenharmony_ci fd(l) 817db96d56Sopenharmony_ci rt(180) 827db96d56Sopenharmony_ci inflatedart(fl, n-1) 837db96d56Sopenharmony_ci lt(54) 847db96d56Sopenharmony_ci fd(l*d) 857db96d56Sopenharmony_ci rt(126) 867db96d56Sopenharmony_ci inflatedart(fl, n-1) 877db96d56Sopenharmony_ci fd(l) 887db96d56Sopenharmony_ci rt(144) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_cidef draw(l, n, th=2): 917db96d56Sopenharmony_ci clear() 927db96d56Sopenharmony_ci l = l * f**n 937db96d56Sopenharmony_ci shapesize(l/100.0, l/100.0, th) 947db96d56Sopenharmony_ci for k in tiledict: 957db96d56Sopenharmony_ci h, x, y = k 967db96d56Sopenharmony_ci setpos(x, y) 977db96d56Sopenharmony_ci setheading(h) 987db96d56Sopenharmony_ci if tiledict[k]: 997db96d56Sopenharmony_ci shape("kite") 1007db96d56Sopenharmony_ci color("black", (0, 0.75, 0)) 1017db96d56Sopenharmony_ci else: 1027db96d56Sopenharmony_ci shape("dart") 1037db96d56Sopenharmony_ci color("black", (0.75, 0, 0)) 1047db96d56Sopenharmony_ci stamp() 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_cidef sun(l, n): 1077db96d56Sopenharmony_ci for i in range(5): 1087db96d56Sopenharmony_ci inflatekite(l, n) 1097db96d56Sopenharmony_ci lt(72) 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_cidef star(l,n): 1127db96d56Sopenharmony_ci for i in range(5): 1137db96d56Sopenharmony_ci inflatedart(l, n) 1147db96d56Sopenharmony_ci lt(72) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_cidef makeshapes(): 1177db96d56Sopenharmony_ci tracer(0) 1187db96d56Sopenharmony_ci begin_poly() 1197db96d56Sopenharmony_ci kite(100) 1207db96d56Sopenharmony_ci end_poly() 1217db96d56Sopenharmony_ci register_shape("kite", get_poly()) 1227db96d56Sopenharmony_ci begin_poly() 1237db96d56Sopenharmony_ci dart(100) 1247db96d56Sopenharmony_ci end_poly() 1257db96d56Sopenharmony_ci register_shape("dart", get_poly()) 1267db96d56Sopenharmony_ci tracer(1) 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_cidef start(): 1297db96d56Sopenharmony_ci reset() 1307db96d56Sopenharmony_ci ht() 1317db96d56Sopenharmony_ci pu() 1327db96d56Sopenharmony_ci makeshapes() 1337db96d56Sopenharmony_ci resizemode("user") 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_cidef test(l=200, n=4, fun=sun, startpos=(0,0), th=2): 1367db96d56Sopenharmony_ci global tiledict 1377db96d56Sopenharmony_ci goto(startpos) 1387db96d56Sopenharmony_ci setheading(0) 1397db96d56Sopenharmony_ci tiledict = {} 1407db96d56Sopenharmony_ci tracer(0) 1417db96d56Sopenharmony_ci fun(l, n) 1427db96d56Sopenharmony_ci draw(l, n, th) 1437db96d56Sopenharmony_ci tracer(1) 1447db96d56Sopenharmony_ci nk = len([x for x in tiledict if tiledict[x]]) 1457db96d56Sopenharmony_ci nd = len([x for x in tiledict if not tiledict[x]]) 1467db96d56Sopenharmony_ci print("%d kites and %d darts = %d pieces." % (nk, nd, nk+nd)) 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_cidef demo(fun=sun): 1497db96d56Sopenharmony_ci start() 1507db96d56Sopenharmony_ci for i in range(8): 1517db96d56Sopenharmony_ci a = clock() 1527db96d56Sopenharmony_ci test(300, i, fun) 1537db96d56Sopenharmony_ci b = clock() 1547db96d56Sopenharmony_ci t = b - a 1557db96d56Sopenharmony_ci if t < 2: 1567db96d56Sopenharmony_ci sleep(2 - t) 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_cidef main(): 1597db96d56Sopenharmony_ci #title("Penrose-tiling with kites and darts.") 1607db96d56Sopenharmony_ci mode("logo") 1617db96d56Sopenharmony_ci bgcolor(0.3, 0.3, 0) 1627db96d56Sopenharmony_ci demo(sun) 1637db96d56Sopenharmony_ci sleep(2) 1647db96d56Sopenharmony_ci demo(star) 1657db96d56Sopenharmony_ci pencolor("black") 1667db96d56Sopenharmony_ci goto(0,-200) 1677db96d56Sopenharmony_ci pencolor(0.7,0.7,1) 1687db96d56Sopenharmony_ci write("Please wait...", 1697db96d56Sopenharmony_ci align="center", font=('Arial Black', 36, 'bold')) 1707db96d56Sopenharmony_ci test(600, 8, startpos=(70, 117)) 1717db96d56Sopenharmony_ci return "Done" 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ciif __name__ == "__main__": 1747db96d56Sopenharmony_ci msg = main() 1757db96d56Sopenharmony_ci mainloop() 176