Рисование фракталов с использованием рекурсии - PullRequest
0 голосов
/ 30 ноября 2018

Недавно я начал изучать рекурсию и заметил, что есть нечто, называемое фракталами, я сделал с ним простое дерево.

Но у меня проблема с получением идеи рекурсии этого фрактала https://i.imgur.com/RMPfwU2.png

Я видел нечто подобное, но с квадратами.

Может ли кто-нибудь объяснить идею рекурсии для этого?Я попробовал этот алгоритм с Python (черепаха)

def fractal(start,length,direction,t):

    if(length < 10):

       return

    t.rt(direction)

    direction = int(direction/360) # To make it only {90,-90}

    t.fd(length)

    fractal(start+length,length/2,direction+90,t)

    fractal(start+length,length/2,direction-90,t)

    t.lt(direction)

    fractal(start+length,length/2,direction+90,t)

    fractal(start+length,length/2,direction-90,t)

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Не самая быстрая реализация, но она компактна и заставляет вас гадать, куда она пойдет дальше:

from turtle import Screen, Turtle

def fractal(turtle, length, minimum):

    if length < minimum:
        return

    angle = 90
    length //= 2

    for _ in range(2):
        for _ in range(2):
            turtle.forward(length)
            turtle.left(angle)
            turtle.forward(length)
            turtle.left(angle)
            fractal(turtle, length, minimum)
            turtle.left(angle)
            turtle.forward(length)
            turtle.right(angle)
            turtle.forward(length)

        angle = -angle

screen = Screen()

yertle = Turtle()
yertle.speed('fastest')  # because I have no patience

fractal(yertle, 100, 10)

screen.exitonclick()

Сначала мы проведем наш путь к верхней правой ноге Н, повернем внутрь и вернемся.Как только мы закончим рекурсию, мы продолжаем поворачиваться в том же направлении, чтобы двигаться вниз по руке.Вместо того, чтобы двигаться полностью вниз по руке (эффективная вещь), мы возвращаемся к нашей исходной точке, но теперь мы сталкиваемся с противоположным путем, поэтому мы просто повторяем все, что мы делали до сих пор, чтобы нарисовать нижний левый угол H..

Как только это закончится, мы снова находимся в центре, снова указывая в первоначальном направлении, поэтому мы повторяем весь процесс снова, но превращаем все наши права в левые, и наоборот, отрицая угол.Это рисует нашу нижнюю левую ногу, а затем заканчивается верхней правой ногой.

enter image description here

0 голосов
/ 30 ноября 2018

Основной формой фрактала является большая буква «Н» с меньшими версиями самого себя на каждом из четырех его кончиков.Итак, что вы в основном должны сделать, это нарисовать букву «H» в черепахе, и всякий раз, когда вы находитесь на кончиках, снова звоните fractal с половиной длины.Имейте в виду, что черепаха всегда должна быть ориентирована в одном и том же направлении при запуске функции и должна возвращаться к началу координат после рисования фигуры.Функция может выглядеть примерно так:

def fractal(length, t):
    if length >= 10 :
        # draw left side 
        t.lt(90)
        t.fd(length)
        t.rt(90)
        t.fd(length)
        fractal(length//2, t)
        t.bk(length*2)
        fractal(length//2, t)
        t.fd(length)
        # draw right side
        t.rt(90)
        t.fd(length*2)
        t.lt(90)
        t.fd(length)
        fractal(length//2, t)
        t.bk(length*2)
        fractal(length//2, t)
        t.fd(length)
        # back to origin
        t.lt(90)
        t.fd(length)
        t.rt(90)

Вы также можете использовать тот факт, что обе стороны фигуры симметричны:

def fractal(length, t):
    if length >= 10:
        t.rt(90)
        side(length, t)
        t.rt(180)
        side(length, t)
        t.rt(90)

def side(length, t):
    t.fd(length)
    t.rt(90)
    t.fd(length)
    fractal(length//2, t)
    t.bk(length*2)
    fractal(length//2, t)
    t.fd(length)
    t.lt(90)
    t.bk(length)
...