Узнайте, как создавать красивые фракталы с помощью Python.
Фракталы: краткий обзор
Какой формы папоротник? А как насчет реки или даже горы? Мы не можем определить их как квадрат или цилиндр, используя простую евклидову геометрию. Вот почему у нас есть фрактальная геометрия: геометрия красивых структур. Фракталы можно увидеть повсюду в природе, и они образуются при многократном повторении шагов.
Иногда фракталы сложно определить по-настоящему, и их объединяют следующие общие черты: симметрия масштабирования, сложность от простоты и дробные измерения. Еще один интересный факт заключается в том, что большинство фракталов не имеют одномерной или двухмерной формы, а на самом деле находятся между ними.
В любом случае, достаточно информации, давайте перейдем к трем фракталам, которые мы будем кодировать: Снежинка Коха, Папоротник Барнсли и Набор Мандельброта!
Снежинка Коха
Снежинка Коха, также известная как остров Коха, основана на кривой Коха, созданной в 1904 году шведским математиком Хельге фон Кохом.
Снежинка строится путем итеративного повторения последовательности этапов, начиная с равностороннего треугольника, затем:
- разделение отрезка на 3 равной длины
- рисуя равносторонний треугольник на среднем сегменте, направленный вверх
- удаление среднего отрезка линии (основания треугольника)
Для этого фрактала мы будем использовать библиотеку Python под названием «Turtle», чтобы нарисовать его, и нам нужно будет импортировать его:
import turtle
Теперь давайте начнем создание Снежинки Коха с создания функции для кривой Коха. Мы будем использовать рекурсию, когда функция вызывает себя прямо или косвенно. Параметры функции:
- черепаха, которая будет черепахой, которая будет рисовать фрактал.
- divis, то есть сколько раз мы собираемся "проделать" шаги, упомянутые выше.
- размер, который определяет длину каждой стороны равностороннего треугольника.
Затем внутри этой функции у нас есть базовый случай, сигнализирующий о том, что, когда количество делений достигнет 0, мы переместим черепаху вперед на длину стороны. Однако, если деление больше 1, у нас будет цикл for, который использует систему Линденмайера для рисования фрактала.
Система Линденмайера - это способ представить рекурсивный фрактал в виде строки. В случае снежинки Коха, начальная струна - «F-F-F», а правило переписывания струны: «F» → «F + F-F + F» и угол 60 °. «F» означает движение вперед, «+» означает поворот вправо на угол, а «-» означает поворот влево на угол. Таким образом, мы получаем следующую функцию:
def koch_fract(turtle, divis, size): if(divis == 0): turtle.forward(size) else: for angle in [60, -120, 60, 0]: koch_fract(turtle, divis - 1, size / 3) turtle.left(angle)
После создания функции мы можем установить некоторые переменные для параметров, которые будут входить в функцию:
divis = 10 # any number of divisions, the larger the number, the more detailed the diagram size = 2000 # any length
Затем мы должны настроить черепаху и экран, чтобы нарисовать фрактал:
wn = turtle.Screen() wn.setup(width=1000, height=500) turtle.speed(100) turtle.pendown()
После этого мы будем использовать цикл for, чтобы использовать нашу функцию кривой Коха для создания Снежинки Коха. Мы вызовем эту функцию кривой Коха 3 раза, каждый раз поворачивая черепаху на 120 ° против часовой стрелки.
for i in range(0, 3): koch_fract(turtle, divis, size) turtle.left(-120)
Вот как это должно выглядеть:
Папоротник Барнсли
Переходим к Папоротнику Барнсли! Это фрактал, впервые придуманный британским математиком Майклом Барнсли в его книге Фракталы повсюду. Он известен как фрактал системы повторяющихся функций (IFS). При построении этого фрактала используются Матрицы, чтобы узнать больше о Матрицах, я бы порекомендовал этот сайт.
Папоротник Барнсли создается с использованием этого матричного преобразования:
Используются четыре различных преобразования, показанных в таблице ниже. Переменные от a до f - это коэффициенты, а p - коэффициент вероятности.
Из этой таблицы мы можем создать 4 функции для нашей программы:
Теперь, когда у нас есть базовое представление о том, как создается папоротник Барнсли, мы можем приступить к его написанию!
Сначала импортируйте следующие библиотеки:
import matplotlib.pyplot as plt from random import randint
Поскольку мы будем рисовать папоротник на диаграмме рассеяния, нам нужно будет создать список для массивов x и y.
x = [0] y = [0]
К созданию фрактала! Мы будем использовать цикл for для итерации n раз, чем больше раз будет выполняться программа, тем более детализирован фрактал. Чтобы создать коэффициент вероятности, мы будем использовать функцию randint из библиотеки Python random для случайного выбора целого числа от 1 до 100. На основе коэффициента вероятности p, мы выполним вышеупомянутые функции и добавим результат в списки x и y.
for i in range(0, 50000): p = randint(1, 100) if p == 1: x.append(0) y.append(0.16*(y[i])) if p >= 2 and p <= 86: x.append(0.85*(x[i]) + 0.04*(y[i])) y.append(-0.04*(x[i]) + 0.85*(y[i])+1.6) if p >= 87 and p <= 93: x.append(0.2*(x[i]) - 0.26*(y[i])) y.append(0.23*(x[i]) + 0.22*(y[i])+1.6) if p >= 94 and p <= 100: x.append(-0.15*(x[i]) + 0.28*(y[i])) y.append(0.26*(x[i]) + 0.24*(y[i])+0.44)
Когда у нас есть все точки, мы можем построить их, используя plt.scatter. Параметр c - это цвет точек на графике, который я установил зеленым в шестнадцатеричном формате. Если вы хотите скрыть оси, используйте функцию plt.axis («off»)!
plt.scatter(x, y, s = 0.2, c ='#5dbb63') plt.axis("off") plt.show()
Вот так получается папоротник Барнсли!
Множество Мандельброта
Последний - Набор Мандельброта, который, на мой взгляд, является одним из самых красивых фракталов на свете! Набор Мандельброта - это набор комплексных чисел, в котором функция не расходится при повторении. Вы можете узнать больше о математике, лежащей в основе множества Мандельброта, на этом веб-сайте. Чтобы программировать это, мы будем использовать итерацию!
Как и в случае с папоротником Барнсли, мы будем рисовать множество Мандельброта на графике, используя matplotlib и numpy! Следовательно, нам нужно будет импортировать эти библиотеки:
import numpy as np import matplotlib.pyplot as plt
Затем нам нужно будет решить, сколько строк и столбцов нам понадобится, это определяет, насколько подробным будет набор, а также количество итераций, которые мы будем использовать.
После этого нам нужно будет запрограммировать две разные функции:
- первая функция вычислит конкретное число в множестве Мандельброта
- вторая функция вычислит числа в множестве Мандельброта
Вот первая функция:
def mandelbrot(c, z): global iterations count = 0 for a in range(iterations): z = z**2 + c count += 1 if(abs(z) > 4): break return count
Параметры c и z представляют точки на комплексной плоскости и координаты соответственно.
Вторая функция:
def mandelbrot_set(x, y): m = np.zeros((len(x), len(y))) for i in range(len(x)): for j in range(len(y)): c = complex(x[i], y[j]) z = complex(0, 0) count = mandelbrot(c, z) m[i, j] = count return m
Параметры x и y представляют собой массивы numpy координат x и y. Сначала мы создадим массив с формой координат x и y под названием m, который будет координатами комплексной плоскости. Затем мы будем перебирать массивы x и y, используя циклы for. Мы создадим комплексное число значений x и y и вызовем нашу функцию mandelbrot (c, z), как описано ранее. Затем счетчик будет добавлен в массив m. После этого мы вернем массив m.
Теперь нам нужно создать наш набор Мандельброта из этих функций и построить его с помощью matplotlib!
# creating our x and y arrays x = np.linspace(-2, 1, rows) y = np.linspace(-1, 1, cols) # create our mandelbrot set m = mandelbrot_set(x, y) # plot the set (best colors: binary, hot, bone, magma) plt.imshow(m.T, cmap = "magma") plt.axis("off") plt.show()
Вот как это должно выглядеть! Разве это не красиво?
Вот как можно запрограммировать Снежинку Коха, Папоротник Барнсли и Набор Мандельброта! Надеюсь, вы многому научились и получили удовольствие от их кодирования. Не стесняйтесь загружать мой код с моего GitHub.
Снежинка Коха: https://github.com/itsliterallymonique/Koch-Fractal-o_O
Барнсли Ферн: https://github.com/itsliterallymonique/Barnsley-Fern
Набор Мандельброта: https://github.com/itsliterallymonique/Mandelbrot-Set