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