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