Узнайте, как создавать красивые фракталы с помощью Python.

Фракталы: краткий обзор

Какой формы папоротник? А как насчет реки или даже горы? Мы не можем определить их как квадрат или цилиндр, используя простую евклидову геометрию. Вот почему у нас есть фрактальная геометрия: геометрия красивых структур. Фракталы можно увидеть повсюду в природе, и они образуются при многократном повторении шагов.

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

В любом случае, достаточно информации, давайте перейдем к трем фракталам, которые мы будем кодировать: Снежинка Коха, Папоротник Барнсли и Набор Мандельброта!

Снежинка Коха

Снежинка Коха, также известная как остров Коха, основана на кривой Коха, созданной в 1904 году шведским математиком Хельге фон Кохом.

Снежинка строится путем итеративного повторения последовательности этапов, начиная с равностороннего треугольника, затем:

  1. разделение отрезка на 3 равной длины
  2. рисуя равносторонний треугольник на среднем сегменте, направленный вверх
  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

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

После этого нам нужно будет запрограммировать две разные функции:

  1. первая функция вычислит конкретное число в множестве Мандельброта
  2. вторая функция вычислит числа в множестве Мандельброта

Вот первая функция:

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