17db96d56Sopenharmony_ci#!/usr/bin/env python3
27db96d56Sopenharmony_ci"""      turtle-example-suite:
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci        tdemo_fractalCurves.py
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ciThis program draws two fractal-curve-designs:
77db96d56Sopenharmony_ci(1) A hilbert curve (in a box)
87db96d56Sopenharmony_ci(2) A combination of Koch-curves.
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciThe CurvesTurtle class and the fractal-curve-
117db96d56Sopenharmony_cimethods are taken from the PythonCard example
127db96d56Sopenharmony_ciscripts for turtle-graphics.
137db96d56Sopenharmony_ci"""
147db96d56Sopenharmony_cifrom turtle import *
157db96d56Sopenharmony_cifrom time import sleep, perf_counter as clock
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciclass CurvesTurtle(Pen):
187db96d56Sopenharmony_ci    # example derived from
197db96d56Sopenharmony_ci    # Turtle Geometry: The Computer as a Medium for Exploring Mathematics
207db96d56Sopenharmony_ci    # by Harold Abelson and Andrea diSessa
217db96d56Sopenharmony_ci    # p. 96-98
227db96d56Sopenharmony_ci    def hilbert(self, size, level, parity):
237db96d56Sopenharmony_ci        if level == 0:
247db96d56Sopenharmony_ci            return
257db96d56Sopenharmony_ci        # rotate and draw first subcurve with opposite parity to big curve
267db96d56Sopenharmony_ci        self.left(parity * 90)
277db96d56Sopenharmony_ci        self.hilbert(size, level - 1, -parity)
287db96d56Sopenharmony_ci        # interface to and draw second subcurve with same parity as big curve
297db96d56Sopenharmony_ci        self.forward(size)
307db96d56Sopenharmony_ci        self.right(parity * 90)
317db96d56Sopenharmony_ci        self.hilbert(size, level - 1, parity)
327db96d56Sopenharmony_ci        # third subcurve
337db96d56Sopenharmony_ci        self.forward(size)
347db96d56Sopenharmony_ci        self.hilbert(size, level - 1, parity)
357db96d56Sopenharmony_ci        # fourth subcurve
367db96d56Sopenharmony_ci        self.right(parity * 90)
377db96d56Sopenharmony_ci        self.forward(size)
387db96d56Sopenharmony_ci        self.hilbert(size, level - 1, -parity)
397db96d56Sopenharmony_ci        # a final turn is needed to make the turtle
407db96d56Sopenharmony_ci        # end up facing outward from the large square
417db96d56Sopenharmony_ci        self.left(parity * 90)
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci    # Visual Modeling with Logo: A Structural Approach to Seeing
447db96d56Sopenharmony_ci    # by James Clayson
457db96d56Sopenharmony_ci    # Koch curve, after Helge von Koch who introduced this geometric figure in 1904
467db96d56Sopenharmony_ci    # p. 146
477db96d56Sopenharmony_ci    def fractalgon(self, n, rad, lev, dir):
487db96d56Sopenharmony_ci        import math
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci        # if dir = 1 turn outward
517db96d56Sopenharmony_ci        # if dir = -1 turn inward
527db96d56Sopenharmony_ci        edge = 2 * rad * math.sin(math.pi / n)
537db96d56Sopenharmony_ci        self.pu()
547db96d56Sopenharmony_ci        self.fd(rad)
557db96d56Sopenharmony_ci        self.pd()
567db96d56Sopenharmony_ci        self.rt(180 - (90 * (n - 2) / n))
577db96d56Sopenharmony_ci        for i in range(n):
587db96d56Sopenharmony_ci            self.fractal(edge, lev, dir)
597db96d56Sopenharmony_ci            self.rt(360 / n)
607db96d56Sopenharmony_ci        self.lt(180 - (90 * (n - 2) / n))
617db96d56Sopenharmony_ci        self.pu()
627db96d56Sopenharmony_ci        self.bk(rad)
637db96d56Sopenharmony_ci        self.pd()
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci    # p. 146
667db96d56Sopenharmony_ci    def fractal(self, dist, depth, dir):
677db96d56Sopenharmony_ci        if depth < 1:
687db96d56Sopenharmony_ci            self.fd(dist)
697db96d56Sopenharmony_ci            return
707db96d56Sopenharmony_ci        self.fractal(dist / 3, depth - 1, dir)
717db96d56Sopenharmony_ci        self.lt(60 * dir)
727db96d56Sopenharmony_ci        self.fractal(dist / 3, depth - 1, dir)
737db96d56Sopenharmony_ci        self.rt(120 * dir)
747db96d56Sopenharmony_ci        self.fractal(dist / 3, depth - 1, dir)
757db96d56Sopenharmony_ci        self.lt(60 * dir)
767db96d56Sopenharmony_ci        self.fractal(dist / 3, depth - 1, dir)
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_cidef main():
797db96d56Sopenharmony_ci    ft = CurvesTurtle()
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci    ft.reset()
827db96d56Sopenharmony_ci    ft.speed(0)
837db96d56Sopenharmony_ci    ft.ht()
847db96d56Sopenharmony_ci    ft.getscreen().tracer(1,0)
857db96d56Sopenharmony_ci    ft.pu()
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    size = 6
887db96d56Sopenharmony_ci    ft.setpos(-33*size, -32*size)
897db96d56Sopenharmony_ci    ft.pd()
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci    ta=clock()
927db96d56Sopenharmony_ci    ft.fillcolor("red")
937db96d56Sopenharmony_ci    ft.begin_fill()
947db96d56Sopenharmony_ci    ft.fd(size)
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci    ft.hilbert(size, 6, 1)
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci    # frame
997db96d56Sopenharmony_ci    ft.fd(size)
1007db96d56Sopenharmony_ci    for i in range(3):
1017db96d56Sopenharmony_ci        ft.lt(90)
1027db96d56Sopenharmony_ci        ft.fd(size*(64+i%2))
1037db96d56Sopenharmony_ci    ft.pu()
1047db96d56Sopenharmony_ci    for i in range(2):
1057db96d56Sopenharmony_ci        ft.fd(size)
1067db96d56Sopenharmony_ci        ft.rt(90)
1077db96d56Sopenharmony_ci    ft.pd()
1087db96d56Sopenharmony_ci    for i in range(4):
1097db96d56Sopenharmony_ci        ft.fd(size*(66+i%2))
1107db96d56Sopenharmony_ci        ft.rt(90)
1117db96d56Sopenharmony_ci    ft.end_fill()
1127db96d56Sopenharmony_ci    tb=clock()
1137db96d56Sopenharmony_ci    res =  "Hilbert: %.2fsec. " % (tb-ta)
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    sleep(3)
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci    ft.reset()
1187db96d56Sopenharmony_ci    ft.speed(0)
1197db96d56Sopenharmony_ci    ft.ht()
1207db96d56Sopenharmony_ci    ft.getscreen().tracer(1,0)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    ta=clock()
1237db96d56Sopenharmony_ci    ft.color("black", "blue")
1247db96d56Sopenharmony_ci    ft.begin_fill()
1257db96d56Sopenharmony_ci    ft.fractalgon(3, 250, 4, 1)
1267db96d56Sopenharmony_ci    ft.end_fill()
1277db96d56Sopenharmony_ci    ft.begin_fill()
1287db96d56Sopenharmony_ci    ft.color("red")
1297db96d56Sopenharmony_ci    ft.fractalgon(3, 200, 4, -1)
1307db96d56Sopenharmony_ci    ft.end_fill()
1317db96d56Sopenharmony_ci    tb=clock()
1327db96d56Sopenharmony_ci    res +=  "Koch: %.2fsec." % (tb-ta)
1337db96d56Sopenharmony_ci    return res
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ciif __name__  == '__main__':
1367db96d56Sopenharmony_ci    msg = main()
1377db96d56Sopenharmony_ci    print(msg)
1387db96d56Sopenharmony_ci    mainloop()
139