Создание фракталов проходит в два этапа:
- создание L-системой (что это мы подробно разберём) строки, состоящей из символов, которая будет представлять для нас подобие набора команд;
- чтение символов строки и выполнение каждого символа как конкретной команды (делать мы это будем при помощи исполнителя черепашки(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
Тадам! Проще говоря у нас есть кусочек строки, который меняется на кусочек побольше, в нём происходят те же самые действия. На этом и основывается принцип самоподобия фракталов. Как же провернуть всё это в нашей функции? Я думаю, никто не будет спорить, что это рекурсия.
Итак, 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-систему:
Действовали, по одному и тому же принципу. Ну, что приступим к исполнению!
Исполнение
Для начала импортируем модуль исполнитель черепашка. Он не встроен поэтому предварительно его необходимо загрузить с командной строки.
import turtle as tl
И произведем необходимые нам настройки исполнителя.
Скорость на максимум, иначе придётся долго ждать. Оптимальное расположение начала отрисовки фрактала, я выбрал уже в конце так, чтобы наш фрактал после отображения не заходил за края экрана.
И конечно, само исполнение. Его мы осуществляем по данному условию:
Здесь F означает «рисуем отрезок», − означает «повернуть влево на 90°», а + означает «повернуть вправо на 90°». X и Y не соответствуют какому-либо действию при рисовании, а используются только для построения кривой.
Команды turtle вы можете посмотреть по этой ссылке.
Ну, что взглянем на общий код:
Запустим его!
Если у вас получилось, то вы создали ваш первый фрактал. Попробуйте создать другие фракталы сами. Например треугольник Серпинского, созданный по одному и тому же принципу:
Надеюсь статья была интересной и полезной. Спасибо, что дочитали до конца.