Папоротник Барнсли

редактировать
Папоротник Барнсли.

Папоротник Барнсли - это фрактал, названный в честь Британский математик Майкл Барнсли, который впервые описал это в своей книге «Фракталы повсюду». Он сделал его похожим на черного селезенку, Asplenium adiantum-nigrum.

Содержание

  • 1 История
  • 2 Конструкция
    • 2.1 Поколение компьютеров
    • 2.2 Мутантные разновидности
  • 3 Примеры синтаксиса
    • 3.1 Python
    • 3.2 R
    • 3.3 Обработка
    • 3.4 P5.JS
    • 3.5 JavaScript (HTML5)
    • 3.6 QBasic
    • 3.7 VBA (CorelDraw)
    • 3.8 Amola
    • 3.9 TSQL
  • 4 MATLAB
  • 5 Ссылки

История

Папоротник - один из основных примеров самоподобных наборов, т.е. это математически сгенерированный шаблон, который может быть воспроизводимыми при любом увеличении или уменьшении. Подобно треугольнику Серпинского, папоротник Барнсли показывает, как графически красивые структуры могут быть построены путем многократного использования математических формул с помощью компьютеров. Книга Барнсли 1988 года «Фракталы повсюду» основана на курсе, который он преподавал для студентов и аспирантов в Школе математики Технологического института Джорджии, который называется «Фрактальная геометрия». После публикации книги был разработан второй курс под названием «Теория фрактальной меры». Работа Барнсли была источником вдохновения для художников-графиков, пытающихся имитировать природу с помощью математических моделей.

Папоротник Барнсли, построенный с помощью Processing Папоротник Барнсли, построенный с помощью Обработка

Код папоротника, разработанный Барнсли, является примером системы повторяющихся функций (IFS) для создания фрактала. Это следует из теоремы о коллаже . Он использовал фракталы для моделирования разнообразных явлений в науке и технике, но в особенности структур растений.

IFS предоставляют модели для определенных растений, листьев и папоротников в силу самоподобия, которое часто встречается в ветвящихся структурах в природе. Но природа также демонстрирует случайность и вариации от одного уровня к другому; Нет двух совершенно одинаковых папоротников, и ветвящиеся листья в меньшем масштабе превращаются в листья. Фракталы с V-переменной допускают такую ​​случайность и изменчивость по масштабам, в то же время допуская непрерывную зависимость от параметров, что облегчает геометрическое моделирование. Эти факторы позволяют нам создавать гибридные биологические модели...... мы предполагаем, что когда найдена геометрическая фрактальная модель с переменной V, которая хорошо соответствует геометрии данного растения, то между ними существует определенная взаимосвязь. кодовые деревья и информация, хранящаяся в генах растения.

- Майкл Барнсли и др.

Конструкция

Настоящие женские папоротники.

Папоротник Барнсли использует четыре аффинных преобразования. Формула для одного преобразования следующая:

f (x, y) = [abcd] [xy] + [ef] {\ displaystyle f (x, y) = {\ begin {bmatrix} a b \\ c d \ end {bmatrix}} {\ begin {bmatrix} x \\ y \ end {bmatrix}} + {\ begin {bmatrix} e \\ f \ end {bmatrix}}}f (x, y) = {\ begin {bmatrix} a b \\ c d \ end {bmatrix}} {\ begin {bmatrix} x \\ y \ end {bmatrix}} + {\ begin {bmatrix} e \\ f \ end {bmatrix}}

Барнсли показывает код IFS для своего черного Фрактал папоротника селезенки в виде матрицы значений, представленных в таблице. В таблице столбцы от «a» до «f» представляют собой коэффициенты уравнения, а «p» представляет коэффициент вероятности.

wabcdefpСозданная порция
ƒ10000,16000,01Шток
ƒ20,850,04-0,040,8501,600,85Листочки меньшего размера, последовательно уменьшающиеся
ƒ30,20-0,260,230,2201,600,07Наибольший левый листок
ƒ4-0,150,280,260,2400,440,07Наибольшая правая листовка

Соответствуют следующим преобразованиям:

f 1 (x, y) = [0,00 0,00 0,00 0,16] [xy] {\ displaystyle f_ {1} ( x, y) = {\ begin {bmatrix} \ 0.00 \ 0.00 \ \\ 0.00 \ 0.16 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}}}{\ displaystyle f_ {1} (x, y) = { \ begin {bmatrix} \ 0.00 \ 0.00 \ \ 0.00 \ 0.16 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}}}
е 2 (x, y) = [0,85 0,04 - 0,04 0,85] [xy] + [0,00 1,60] {\ displaystyle f_ {2} (x, y) = {\ begin {bmatrix} \ 0,85 \ 0,04 \ \\ -0.04 \ 0.85 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}} + {\ begin {bmatrix} \ 0.00 \\ 1.60 \ end {bmatrix}}}{\ displaystyle f_ {2} (x, y) = {\ begin {bmatrix} \ 0.85 \ 0.04 \ \\ - 0.04 \ 0.85 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}} + {\ begin {bmatrix} \ 0.00 \\ 1.60 \ end {bmatrix}}}
е 3 (x, y) = [0,20 - 0,26 0,23 0,22] [xy] + [0,00 1,60] {\ displaystyle f_ {3} (x, y) = {\ begin {bmatrix} \ 0,20 \ -0,26 \ \ \ 0,2 3 \ 0.22 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}} + {\ begin {bmatrix} \ 0.00 \\ 1.60 \ end {bmatrix}}}{\ displaystyle f_ {3} (x, y) = {\ begin {bmatrix} \ 0.20 \ -0.26 \ \\ 0.23 \ 0.22 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}} + {\ begin {bmatrix} \ 0.00 \\ 1.60 \ end { bmatrix}}}
f 4 (x, y) = [- 0,15 0,28 0,26 0,24] [xy] + [0,00 0,44] {\ displaystyle f_ {4} (x, y) = {\ begin {bmatrix} \ -0,15 \ 0,28 \ \\ 0,26 \ 0.24 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix}} + {\ begin {bmatrix} \ 0.00 \\ 0.44 \ end {bmatrix}}}{\ displaystyle f_ {4} (x, y) = {\ begin {bmatrix} \ -0.15 \ 0.28 \ \\ 0.26 \ 0.24 \ end {bmatrix}} {\ begin {bmatrix} \ x \\ y \ end {bmatrix }} + {\ begin {bmatrix} \ 0.00 \\ 0.44 \ end {bmatrix}}}

Компьютерное создание

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

Хотя папоротник Барнсли теоретически можно нарисовать от руки ручкой и миллиметровой бумагой, количество необходимых итераций исчисляется десятками тысяч, что делает использование компьютера практически обязательным. Многие компьютерные модели папоротника Барнсли популярны среди современных математиков. Пока математика запрограммирована правильно с использованием матрицы констант Барнсли, будет получена такая же форма папоротника.

Первая нарисованная точка находится в начале координат (x 0 = 0, y 0 = 0), а затем новые точки итеративно вычисляются путем случайного применения одного из следующие четыре преобразования координат:

ƒ1

xn + 1 = 0
yn + 1 = 0,16 y n.

Это преобразование координат выбирается в 1% случаев и просто отображает любую точку в точку в первом отрезке линии у основания стебля. Эта часть рисунка будет завершена в первую очередь в ходе итераций.

. ƒ2

xn + 1 = 0,85 x n + 0,04 y n
yn + 1 = −0,04 x n + 0,85 y n + 1.6.

Это преобразование координат выбирается в 85% случаев и сопоставляет любую точку внутри листовки, представленной красным треугольником, с точкой внутри противоположной, меньшей листовки, представленной синим треугольником на рисунке.

ƒ3

xn + 1 = 0,2 x n - 0,26 y n
yn + 1 = 0,23 x n + 0,22 y n + 1.6.

Это преобразование координат выбирается в 7% случаев и сопоставляет любую точку внутри листочка (или ушной раковины), представленного синим треугольником, с точкой внутри чередующегося соответствующего треугольника поперек стержня (оно переворачивает его).

ƒ4

xn + 1 = −0,15 x n + 0,28 y n
yn + 1 = 0,26 x n + 0,24 y n + 0,44.

Это преобразование координат выбирается в 7% случаев и сопоставляет любую точку внутри листочка (или ушной раковины), представленного синим треугольником, с точкой внутри чередующегося соответствующего треугольника поперек стержня (без его переворачивания).

Первое преобразование координат рисует стержень. Второй создает последовательные копии стебля и нижних листьев, чтобы получился полноценный папоротник. Третий рисует нижний лист слева. Четвертый рисует нижний лист справа. Рекурсивный характер IFS гарантирует, что целое является более крупной копией каждой ветви. Обратите внимание, что полный папоротник находится в диапазоне -2,1820 < x < 2.6558 and 0 ≤ y < 9.9983.

Мутантные разновидности

Папоротник Барнсли мутировал в папоротник Thelypteridaceae. Папоротник Барнсли мутировал в лептоспорангиатный папоротник.

По играя с коэффициентами, можно создать мутантные сорта папоротника. В своей статье о фракталах V-переменной Барнсли называет эту особенность суперфракталом.

Один экспериментатор придумал таблицу коэффициентов, чтобы получить другой папоротник удивительно естественно выглядящий, но напоминающий Cyclosorus или Thelypteridaceae папоротник. Это:

wabcdefp
ƒ10000,250-0,40,02
ƒ20,950,005-0,0050,93−0,0020,50,84
ƒ30,035-0,20,160,04- 0,090,020,07
ƒ4-0,040,20,160,040,0830,120,07

.

Примеры синтаксиса

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

Python

import turtle import random pen = turtle.Turtle () pen.speed (15) pen.color ("blue") pen.penup () x = 0 y = 0 для n в диапазоне (110000): pen.goto (65 * x, 37 * y - 252) # 57 - это масштабирование папоротника, а -275 - начало рисования снизу. pen.pendown () pen.dot () pen.penup () r = random.random () # чтобы получить вероятность r = r * 100 xn = x yn = y if r < 1: # elif ladder based on the probability x = 0 y = 0.16 * yn elif r < 86: x = 0.85 * xn + 0.04 * yn y = -0.04 * xn + 0.85 * yn + 1.6 elif r < 93: x = 0.20 * xn - 0.26 * yn y = 0.23 * xn + 0.22 * yn + 1.6 else: x = -0.15 * xn + 0.28 * yn y = 0.26 * xn + 0.24 * yn + 0.44

R

# Barnsley's Fern # создать функцию вероятность и текущая точка Fractal_fern2 <- function(x, p){ if (p <= 0.01) { m <- matrix(c(0, 0, 0,.16), 2, 2) f <- c(0, 0) } else if (p <= 0.86) { m <- matrix(c(.85, -.04,.04,.85), 2, 2) f <- c(0, 1.6) } else if (p <= 0.93) { m <- matrix(c(.2,.23, -.26,.22), 2, 2) f <- c(0, 1.6) } else { m <- matrix(c(-.15,.26,.28,.24), 2, 2) f <- c(0,.44) } m %*% x + f } # how many reps determines how detailed the fern will be reps <- 10000 # create a vector with probability values, and a matrix to store coordinates p <- runif(reps) # initialise a point at the origin coords <- c(0, 0) # compute Fractal Coordinates m <- Reduce(fractal_fern2, p, accumulate = T, init = coords) m <- t(do.call(cbind, m)) # Create plot plot(m, type = "p", cex = 0.1, col = "darkgreen", xlim = c(-3, 3), ylim = c(0, 10), xlab = NA, ylab = NA, axes = FALSE)

Обработка

/ * Barnsley Fern for Processing 3.4 * / // объявление переменных x и y float x, y; // создание холста void setup () {size (600, 600); фон (255); } / * установка обводки, отображение холста и затем нанесение точек * / void drawPoint () {stroke (34, 139, 34); strokeWeight (1); float px = map (x, -2,1820, 2,6558, 0, ширина); float py = map (y, 0, 9.9983, height, 0); точка (px, py); } / * алгоритм вычисления значения (n + 1) -го члена x и y на основе матриц преобразования * / void nextPoint () {float nextX, nextY; float r = random (1); if (r < 0.01) { nextX = 0; nextY = 0.16 * y; } else if (r < 0.86) { nextX = 0.85 * x + 0.04 * y; nextY = -0.04 * x + 0.85 * y + 1.6; } else if (r < 0.93) { nextX = 0.20 * x - 0.26 * y; nextY = 0.23 * x + 0.22 * y + 1.6; } else { nextX = -0.15 * x + 0.28 * y; nextY = 0.26 * x + 0.24 * y + 0.44; } x = nextX; y = nextY; } /* iterate the plotting and calculation functions over a loop */ void draw() { for (int i = 0; i < 100; i++) { drawPoint(); nextPoint(); } }

P5.JS

let x = 0; let y = 0; function setup () {createCanvas (600, 600); background (0);} // диапазон −2,1820 < x < 2.6558 and 0 ≤ y < 9.9983. function drawPoint() { stroke(255); strokeWeight(1); let px = map(x, -2.1820, 2.6558, 0, width); let py = map(y, 0, 9.9983, height, 0); point(px, py); } function nextPoint() { let nextX; let nextY; let r = random(1); if (r < 0.01) { //1 nextX = 0; nextY = 0.16 * y; } else if (r < 0.86) { //2 nextX = 0.85 * x + 0.04 * y; nextY = -0.04 * x + 0.85 * y + 1.60; } else if (r < 0.93) { //3 nextX = 0.20 * x + -0.26 * y; nextY = 0.23 * x + 0.22 * y + 1.60; } else { //4 nextX = -0.15 * x + 0.28 * y; nextY = 0.26 * x + 0.24 * y + 0.44; } x = nextX; y = nextY; } function draw() { for (let i = 0; i < 1000; i++) { drawPoint(); nextPoint(); } }

.

JavaScript ( HTML5)

QBasic

SCREEN 12 WINDOW (-5, 0) - (5, 10) RANDOMIZE TIMER COLOR 10 DO SELECT CASE RND CASE IS <.01 nextX = 0 nextY =.16 * y CASE.01 TO.08 nextX =.2 * x -.26 * y nextY =.23 * x +.22 * y + 1.6 CASE.08 TO.15 nextX = -.15 * x +.28 * y nextY =.26 * x +.24 * y +.44 CASE ELSE nextX =.85 * x +.04 * y nextY = -.04 * x +.85 * y + 1.6 END SELECT x = nextX y = nextY PSET (x, y) LOOP UNTIL INKEY$ = CHR$(27)

VBA (CorelDraw)

Sub Barnsley () Dim iEnd As Long Dim i As Long Dim x As Double Dim y As Double Dim nextX As Double Dim nextY As Double Dim sShapeArray () As Shape Dim dSize As Double Dim sColor As String dSize = 0.01 'Размер точек sColor = "0,0,100"' Цвет точек RGB, диапазон значений от 0 до 255 iEnd = 5000 'Число итераций ReDim sShapeArray (iEnd)' В Corel для каждого нарисованного объекта требуется собственное имя переменной Randomize 'Инициализировать функцию Rnd For i = 0 To iEnd' Iterate... Выберите Case Rnd Case Is < 0.01 ' f1 = Draw stem nextX = 0 nextY = 0.16 * y Case 0.01 To 0.08 ' f3 nextX = 0.2 * x - 0.26 * y nextY = 0.23 * x + 0.22 * y + 1.6 Case 0.08 To 0.15 ' f4 nextX = -0.15 * x + 0.28 * y nextY = 0.26 * x + 0.24 * y + 0.44 Case Else ' f2 nextX = 0.85 * x + 0.04 * y nextY = -0.04 * x + 0.85 * y + 1.6 End Select x = nextX y = nextY Set sShapeArray(i) = ActiveLayer.CreateEllipse2(x + 2.5, y + 0.5, dSize) sShapeArray(i).Style.StringAssign "{""fill"":{""primaryColor"":""RGB255,USER," sColor ",100,00000000-0000-0000-0000-000000000000"",""secondaryColor"":""RGB255,USER,255,255,255,100,00000000-0000-0000-0000-000000000000"",""type"":""1"",""fillName"":null},""outline"":{""width"":""0"",""color"":""RGB255,USER,0,0,0,100,00000000-0000-0000-0000-000000000000""},""transparency"":{}}" DoEvents Next End Sub

Amola

1 addpackage ("Forms.dll") 2 3 set ("x", 0) 4 set ("y", 0) 5 set ("width", 600) 6 set ("height", 600) 7 8 method setup () 9 createCanvas (width, height) 10 rect (0, 0, 600, 600, color (0, 0, 0)) 11 end 12 13 method drawPoint () 14 set ("curX", div (mult (width, add (x, 3)), 6)) 15 set ("curY", sub (height, mult (height, div (add (y, 2), 14)))) 16 set ("size", 1) 17 // log (curX) 18 // log (curY) 19 rect (round (curX - size / 2), round (curY - size / 2), round (curX + size / 2), round (curY + size / 2), color (34, 139, 34)) 20 конец 21 22 метод nextPoint () 23 set ("nextX", 0) 24 set ("nextY", 0) 25 set ("random", random (0, 100)) 26 if (random < 1) 27 set("nextX", 0) 28 set("nextY", 0.16 * y) 29 end 30 else 31 if(random < 86) 32 set("nextX", 0.85 * x + 0.04 * y) 33 set("nextY", -0.04 * x + 0.85 * y + 1.6) 34 end 35 else 36 if(random < 93) 37 set("nextX", 0.2 * x - 0.26 * y) 38 set("nextY", 0.23 * x + 0.22 * y + 1.6) 39 end 40 else 41 set("nextX", -0.15 * x + 0.28 * y) 42 set("nextY", 0.26 * x + 0.24 * y + 0.44) 43 end 44 end 45 end 46 47 set("x", nextX) 48 set("y", nextY) 49 end 50 51 setup() 52 while(true) 53 drawPoint() 54 nextPoint() 55 end

TSQL

/ * таблица результатов * / объявление @fern table (Fun int, X float, Y float, Seq int identity (1,1) pri mary key, DateAdded datetime default getdate ()) объявить @i int = 1 / * взаимодействия * / объявить @fun int / * случайную функцию * / объявить @x float = 0 / * инициализировать X = 0 * / объявить @y float = 0 / * инициализация Y = 0 * / объявление @ и вставка с плавающей запятой в значения @fern (Fun, X, Y) (0,0,0) / * установка начальной точки * / в то время как @i < 5000 /* how many points? */ begin set @rand = rand() select @Fun = case /* get random function to use -- @fun = f1 = 1%, f2 = 85%, f3 = 7%, f4 = 7% */ when @rand <= 0.01 then 1 when @rand <= 0.86 then 2 when @rand <= 0.93 then 3 when @rand <= 1 then 4 end select top 1 @X = X, @Y = Y from @fern order by Seq desc /* get previous point */ insert into @fern(Fun, X, Y) /* transform using four different function expressions */ select @fun, case @fun when 1 then 0 when 2 then 0.85*@x+0.04*@y when 3 then 0.2*@x-0.26*@y when 4 then -0.15*@x + 0.28*@y end X, case @fun when 1 then 0.16*@y when 2 then -0.04*@x + 0.85*@y + 1.6 when 3 then 0.23*@x + 0.22*@y + 1.6 when 4 then 0.26*@x + 0.24*@y + 0.44 end Y set @[email#160;protected] +1 end select top 5000 *,geography::Point(Y, X, 4326) from @fern order by newid()

MATLAB

AI = [0 0; 0 0,16]; AII = [0,85 0,04; -0,04 0,85]; AIII = [0,2 -0,26; 0,23 0,22]; AIV = [-0,15 0,28; 0,26 0,24]; BI = [0; 0]; BII = [0; 1.6]; BIII = [0; 1.6]; BIV = [0; 0,44]; N = 100000; H = нули (N, 2); х = 0; у = 0; Т = [х; у]; для i = 2: N p = rand; if p < 0.01 %disp('Scheme 1') S1 = AI*T + BI; x = S1(1); y = S1(2); elseif p < 0.85 %disp('Scheme 2') S2 = AII*T + BII; x = S2(1); y = S2(2); elseif p < 0.93 %disp('Scheme 3') S3 = AIII*T + BII; x = S3(1); y = S3(2); else %disp('Scheme 4') S4 = AIV*T + BIV; x = S4(1); y = S4(2); end %%Update T T = [x;y]; H(i,1) = x; H(i,2) = y; end X = H(:,1); Y = H(:,2); plot(X,Y,'.', 'Color', [79, 121, 66]/256, 'markersize', 0.1)

Ссылки

Последняя правка сделана 2021-05-11 12:35:19
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте