Найти тему
OAKCreative

Фракталы на Python – это просто.

Оглавление
Фрактал. Источник фото – сайт: https://clck.ru/VNGtM
Фрактал. Источник фото – сайт: https://clck.ru/VNGtM

Создание фракталов проходит в два этапа:

  1. создание L-системой (что это мы подробно разберём) строки, состоящей из символов, которая будет представлять для нас подобие набора команд;
  2. чтение символов строки и выполнение каждого символа как конкретной команды (делать мы это будем при помощи исполнителя черепашки(turtle)).

Итак, начнём.

L-система

Давайте создадим самую простейшую L-систему водоросли:

  • Для этого возьмём аксиому (строку с которой мы начнём) A. Поместим её в функцию (назовём её seaweed()), которая и будет нашей L-системой (например seaweed('A')).
  • Что же будет делать наша функция? Всё очень просто. Она заданное количество раз (пусть будет n) пробегается по нашей строке и заменяет (A → AB), (B → A). Например:

n = 0 : A

n = 1 : AB

n = 2 : ABA

n = 3 : ABAAB

n = 4 : ABAABABA

n = 5 : ABAABABAABAAB

n = 6 : ABAABABAABAABABAABABA

n = 7 : ABAABABAABAABABAABABAABAABABAABAAB

Тадам! Проще говоря у нас есть кусочек строки, который меняется на кусочек побольше, в нём происходят те же самые действия. На этом и основывается принцип самоподобия фракталов. Как же провернуть всё это в нашей функции? Я думаю, никто не будет спорить, что это рекурсия.

Водоросли l-система
Водоросли l-система

Итак, n – это ограничение нашей рекурсии поэтому в самом начале зададим условия выхода. Наша рекурсия выполнится 6 раз т.к. 7 раз ей не даст выполниться выход из рекурсии (в котором мы возвращаем готовую строку).

Что мы видим дальше. newlevel – это строка которая в цикле преобразуется в строку, полученную заменой по нашему условию ((A → AB), (B → A)) символов старой.

А затем просто присвоим старой строке новое значение и пойдём рекурсией дальше на новый уровень. В конце концов программа напечатает: ABAABABAABAABABAABABA.

Единственное, мы не сможем её красиво визуализировать, т.к. она состоит всего из двух букв и после визуализации будет выглядеть довольно скучно. Но на ней мы поняли принцип L-систем. Кстати, по ссылке можно найти ещё несколько классных L-систем, которые уже можно преобразовать во фракталы.

Возьмём, например, фрактал кривая Дракона. Посмотрим его условия:

переменные : X, Y
константы : F, +, −
старт  : FX
правила  : (X → X+YF+), (Y → −FX−Y)
угол  : 90°
Здесь F означает «рисуем отрезок», − означает «повернуть влево на 90°», а + означает «повернуть вправо на 90°». X и Y не соответствуют какому-либо действию при рисовании, а используются только для построения кривой.

Константы − это символы, которые при создании в рекурсии новой строки, мы просто переписываем неизменными.

Итак, создадим L-систему:

Кривая Дракона l-система
Кривая Дракона l-система

Действовали, по одному и тому же принципу. Ну, что приступим к исполнению!

Исполнение

Для начала импортируем модуль исполнитель черепашка. Он не встроен поэтому предварительно его необходимо загрузить с командной строки.

import turtle as tl

И произведем необходимые нам настройки исполнителя.

Настройки
Настройки

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

И конечно, само исполнение. Его мы осуществляем по данному условию:

Здесь F означает «рисуем отрезок», − означает «повернуть влево на 90°», а + означает «повернуть вправо на 90°». X и Y не соответствуют какому-либо действию при рисовании, а используются только для построения кривой.
Исполнение
Исполнение

Команды turtle вы можете посмотреть по этой ссылке.

Ну, что взглянем на общий код:

Общий код
Общий код

Запустим его!

Кривая дракона
Кривая дракона

Если у вас получилось, то вы создали ваш первый фрактал. Попробуйте создать другие фракталы сами. Например треугольник Серпинского, созданный по одному и тому же принципу:

Код треугольника Серпинского
Код треугольника Серпинского
Сам треугольник Серпинского
Сам треугольник Серпинского

Надеюсь статья была интересной и полезной. Спасибо, что дочитали до конца.