Рубрики
Без рубрики

Рекурсия Python – Забава с фракталами

Использование рекурсии в программировании на Python для создания фрактальных паттернов.

Автор оригинала: Robin Andrews.

Одна из замечательных вещей в Python Turtle Graphics заключается в том, как она дает вам мгновенную визуальную обратную связь о том, что делает ваша программа. Это делает его очень мощным инструментом для изучения многих тем-информатики и программирования в целом. Эта статья посвящена использованию графики черепахи Python для рисования фрактального паттерна, используя важный метод программирования, называемый рекурсия . Вы можете прочитать больше о рекурсии в целом в этом посте в блоге . Здесь мы подробнее остановимся на том, как черепашья графика используется для рисования узора.

Вы можете увидеть программу в действии здесь на repl.it

Фрактал – это повторяющийся паттерн, который выглядит одинаково на разных уровнях увеличения.

Если вы новичок в программировании на Python, основной код этой программы, вероятно, будет слишком сложным для понимания. Тем не менее, даже будучи новичком, вы можете получить довольно большой пробег, играя со значениями этих констант:

  • СКОРОСТЬ
  • BG_COLOR
  • ЦВЕТ ПЕРА
  • ШИРИНА ПЕРА
  • FRACTAL_DEPTH

Измените их значения и посмотрите, какой эффект они окажут. Для цветов возможны наиболее распространенные названия цветов – просто не забудьте поместить имя внутри "" s, например "darkorchid" . Полный список возможных цветов доступен здесь .

Классическим примером фракталов в природе являются листья папоротника – обратите внимание, как исходная форма повторяется в меньшем масштабе внутри листа.

Классическим примером фракталов в природе являются листья папоротника - обратите внимание, как исходная форма повторяется в меньшем масштабе внутри листа.

Фрактал H-дерева с графикой черепах Питона

Фрактал H-дерева – довольно простой фрактал с простым правилом для его построения.

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

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

Это лучше всего понять с помощью фотографий:

Вот уровень 0 (люди Python любят считать с нуля….)

Вот уровень 0 (люди Python любят считать с нуля....)

Следующий уровень или глубина добавить H фигуры в каждом из углов предыдущей версии:

Следующий уровень или || глубина || добавить || H || фигуры в каждом из углов предыдущей версии:

….. и картина повторяется..

..... и картина повторяется..

Следующий уровень:

Следующий уровень:

Код Python для фрактального H-дерева с черепашьей графикой

Самая важная работа, проделанная этой программой, заключается в призывах к

recursive_draw(tur, x, y, ширина, высота, количество)

Аргументы относятся к черепахе, которую мы хотим нарисовать, координатам x , y , где will начнет рисовать наш H , и ширине/высоте для H , требуемой на этом конкретном уровне. Обратите внимание, что по мере того, как функция вызывает себя, чтобы нарисовать новый H шпаес, эти аргументы меняются!

Чтобы понять, как на самом деле работает эта программа, вам нужно будет временно отвести взгляд от экрана. Возьмите обычную бумагу или графическую бумагу и карандаш, нарисуйте оси x и y и начните отмечать некоторые значения координат. Вы можете проверить свою работу, раскомментировав инструкцию print внутри draw_line () , чтобы получить представление о том, что происходит внутри программы. Например:

recursive_draw изначально вызывается с помощью recursive_draw(исполнитель, - DRAWING_WIDTH/2, - DRAWING_HEIGHT/2, DRAWING_WIDTH, DRAWING_HEIGHT, FRACTAL_DEPTH)

Этот начальный вызов draw_line() , который вызывается из recursive_draw() , будет использовать эти координаты:

Этот начальный вызов || draw_line() || , который вызывается из || recursive_draw() || , будет использовать эти координаты:

Следует отметить две очень важные вещи, без которых рекурсия не может работать::

  • Базовый случай
  • Рекурсивный шаг

Они помечены комментариями в коде. Все рекурсивные алгоритмы должны приближаться к базовому случаю, иначе они никогда не перестанут выполняться, пока не закончится доступная память.

Список кода Python для фрактала H-дерева

Вот полный список для фрактала H-дерева графики черепахи Python:

"""
H-Tree Fractal using recursion and Turtle Graphics.
Robin Andrews - https://compucademy.net/
"""

import turtle

SPEED = 5
BG_COLOR = "blue"
PEN_COLOR = "lightgreen"
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 800
DRAWING_WIDTH = 700
DRAWING_HEIGHT = 700
PEN_WIDTH = 5
TITLE = "H-Tree Fractal with Python Turtle Graphics"
FRACTAL_DEPTH = 3


def draw_line(tur, pos1, pos2):
    # print("Drawing from", pos1, "to", pos2)  # Uncomment for tracing the algorithm.
    tur.penup()
    tur.goto(pos1[0], pos1[1])
    tur.pendown()
    tur.goto(pos2[0], pos2[1])


def recursive_draw(tur, x, y, width, height, count):
    draw_line(
        tur,
        [x + width * 0.25, height // 2 + y],
        [x + width * 0.75, height // 2 + y],
    )
    draw_line(
        tur,
        [x + width * 0.25, (height * 0.5) // 2 + y],
        [x + width * 0.25, (height * 1.5) // 2 + y],
    )
    draw_line(
        tur,
        [x + width * 0.75, (height * 0.5) // 2 + y],
        [x + width * 0.75, (height * 1.5) // 2 + y],
    )

    if count <= 0:  # The base case
        return
    else:  # The recursive step
        count -= 1
        # Top left
        recursive_draw(tur, x, y, width // 2, height // 2, count)
        # Top right
        recursive_draw(tur, x + width // 2, y, width // 2, height // 2, count)
        # Bottom left
        recursive_draw(tur, x, y + width // 2, width // 2, height // 2, count)
        # Bottom right
        recursive_draw(tur, x + width // 2, y + width // 2, width // 2, height // 2, count)


if __name__ == "__main__":
    # Screen setup
    screen = turtle.Screen()
    screen.setup(SCREEN_WIDTH, SCREEN_HEIGHT)
    screen.title(TITLE)
    screen.bgcolor(BG_COLOR)

    # Turtle artist (pen) setup
    artist = turtle.Turtle()
    artist.hideturtle()
    artist.pensize(PEN_WIDTH)
    artist.color(PEN_COLOR)
    artist.speed(SPEED)

    # Initial call to recursive draw function
    recursive_draw(artist, - DRAWING_WIDTH / 2, - DRAWING_HEIGHT / 2, DRAWING_WIDTH, DRAWING_HEIGHT, FRACTAL_DEPTH)

    # Every Python Turtle program needs this (or an equivalent) to work correctly.
    turtle.done()

Счастливых вычислений!

Эта статья основана на посте на Блог академии Компу .