Programming Pandit

c/c++/c#/Javav/Python


Latest Update

Thursday, September 10, 2020

Fractal Curve Design Python programming Demo by G Krishna Chauhan

Source Code 


#!/usr/bin/env python3

"""      turtle-example-suite:


        tdemo_fractalCurves.py


This program draws two fractal-curve-designs:

(1) A hilbert curve (in a box)

(2) A combination of Koch-curves.


The CurvesTurtle class and the fractal-curve-

methods are taken from the PythonCard example

scripts for turtle-graphics.

"""

from turtle import *

from time import sleep, perf_counter as clock


class CurvesTurtle(Pen):

    # example derived from

    # Turtle Geometry: The Computer as a Medium for Exploring Mathematics

    # by Harold Abelson and Andrea diSessa

    # p. 96-98

    def hilbert(self, size, level, parity):

        if level == 0:

            return

        # rotate and draw first subcurve with opposite parity to big curve

        self.left(parity * 90)

        self.hilbert(size, level - 1, -parity)

        # interface to and draw second subcurve with same parity as big curve

        self.forward(size)

        self.right(parity * 90)

        self.hilbert(size, level - 1, parity)

        # third subcurve

        self.forward(size)

        self.hilbert(size, level - 1, parity)

        # fourth subcurve

        self.right(parity * 90)

        self.forward(size)

        self.hilbert(size, level - 1, -parity)

        # a final turn is needed to make the turtle

        # end up facing outward from the large square

        self.left(parity * 90)


    # Visual Modeling with Logo: A Structural Approach to Seeing

    # by James Clayson

    # Koch curve, after Helge von Koch who introduced this geometric figure in 1904

    # p. 146

    def fractalgon(self, n, rad, lev, dir):

        import math


        # if dir = 1 turn outward

        # if dir = -1 turn inward

        edge = 2 * rad * math.sin(math.pi / n)

        self.pu()

        self.fd(rad)

        self.pd()

        self.rt(180 - (90 * (n - 2) / n))

        for i in range(n):

            self.fractal(edge, lev, dir)

            self.rt(360 / n)

        self.lt(180 - (90 * (n - 2) / n))

        self.pu()

        self.bk(rad)

        self.pd()


    # p. 146

    def fractal(self, dist, depth, dir):

        if depth < 1:

            self.fd(dist)

            return

        self.fractal(dist / 3, depth - 1, dir)

        self.lt(60 * dir)

        self.fractal(dist / 3, depth - 1, dir)

        self.rt(120 * dir)

        self.fractal(dist / 3, depth - 1, dir)

        self.lt(60 * dir)

        self.fractal(dist / 3, depth - 1, dir)


def main():

    ft = CurvesTurtle()


    ft.reset()

    ft.speed(0)

    ft.ht()

    ft.getscreen().tracer(1,0)

    ft.pu()


    size = 6

    ft.setpos(-33*size, -32*size)

    ft.pd()


    ta=clock()

    ft.fillcolor("red")

    ft.begin_fill()

    ft.fd(size)


    ft.hilbert(size, 6, 1)


    # frame

    ft.fd(size)

    for i in range(3):

        ft.lt(90)

        ft.fd(size*(64+i%2))

    ft.pu()

    for i in range(2):

        ft.fd(size)

        ft.rt(90)

    ft.pd()

    for i in range(4):

        ft.fd(size*(66+i%2))

        ft.rt(90)

    ft.end_fill()

    tb=clock()

    res =  "Hilbert: %.2fsec. " % (tb-ta)


    sleep(3)


    ft.reset()

    ft.speed(0)

    ft.ht()

    ft.getscreen().tracer(1,0)


    ta=clock()

    ft.color("black", "blue")

    ft.begin_fill()

    ft.fractalgon(3, 250, 4, 1)

    ft.end_fill()

    ft.begin_fill()

    ft.color("red")

    ft.fractalgon(3, 200, 4, -1)

    ft.end_fill()

    tb=clock()

    res +=  "Koch: %.2fsec." % (tb-ta)

    return res


if __name__  == '__main__':

    msg = main()

    print(msg)

    mainloop()





No comments:

Post a Comment