Алгебраические фракталы. Рис. 85. Фрактал Мандельброта

 
  Алгебраические фракталы. Рис. 85. Фрактал Мандельброта - student2.ru

Рис. 85. Фрактал Мандельброта

Вторая большая группа фракталов – алгебраические. Свое название они получили, за то, что их строят, используя простые алгебраические формулы.

Получают их с помощью нелинейных процессов в n-мерных пространствах. Известно, что нелинейные динамические системы обладают несколькими устойчивыми состояниями. Состояние, в котором окажется динамическая система после некоторого числа итераций, зависит от начальных условий. Поэтому каждое устойчивое состояние (аттрактор) обладает некоторой областью начальных состояний, при которых система обязательно перейдет в рассматриваемые конечные состояния. Таким образом, фазовое пространство разбивается на области притяжения аттракторов.

Самыми известными из них являются множества Мандельброта и Жюлиа, Бассейны Ньютона и т.д.

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

Множество Мандельброта получают следующим образом: строится отображение z'=fc(z), где числа z и c - комплексные.

Алгоритм построения множества Мандельброта выглядит следующим образом:

1. выбираем значение c

2. z:=0 n:=0

3. z:=f(z)

4. inc(n)

Если не достигнуто максимальное значение итераций или значение z не превысило максимального значения, то повторять шаги 3 и 4.

Наиболее часто используется формула z = z2 + c, так как она наиболее проста в применении. Раскладывая уравнение на действительную и мнимую часть, получаем следующее:

Re: x2- y2+ a
Im: 2xy + b,
приняв, что z = x + yi и c = a + bi.

Цвет обычно выбирают по числу итераций, но есть и другие способы.
Текст программы выглядит следующим образом.

Program M2;

Uses Graph, Crt;

Type

TComplex = Record

X : Real;

Y : Real;

End;

Const

iter = 50;

max = 16;

Var

z, t, c : TComplex;

x, y, n : Integer;

Cancel : Boolean;

gd, gm : Integer;

mx, my : Integer;

Begin

Cancel := False;

Randomize;

gd := Detect;

InitGraph(gd,gm,'e:\bp\bgi');

Mx := GetMaxX div 2;

My := GetMaxY div 2;

For y := -my to my do

For x := -mx to mx do Begin

n := 0;

C.X := X * 0.005;

C.Y := Y * 0.005;

z.X := 0;

z.Y := 0;

While (sqr(z.X) + sqr(z.Y) < max) and (n < iter) do Begin

t := z;

Z.X := sqr(t.X) - sqr(t.Y) + C.X;

Z.Y := 2 * t.X * t.Y+ C.Y;

Inc(n);

If keypressed then cancel := true;

End;

If n < iter then Begin

PutPixel(mx + x,my + y,16 - (n mod 16));

End;

If cancel then exit;

End;

Readkey;

CloseGraph;

end.

А теперь опишем программу словами. Для всех точек на комплексной плоскости в некотором интервале вычисляем достаточно большое количество раз z = z2 + c, каждый раз проверяя абсолютное значение z. Если это значение больше максимального, то рисуем точку с цветом, вычисляемым по количеству итераций, иначе рисуем точку черного цвета.

Черный цвет в середине показывает, что в этих точках функция стремится к нулю - это и есть множество Мандельброта. За пределами этого множества функция стремится к бесконечности. А самое интересное - это границы множества. Они то и являются фрактальными. Если рассмотреть увеличение, то можно увидеть самоподобие фигуры.

Увеличение фракталов.
Для того чтобы увеличить данный объект, необходимо изменить коэффициенты в следующем куске кода:

C.X:=X*0.005;

C.Y:=Y*0.005;

Чем меньше число, тем больше увеличение и наоборот. Для того чтобы сместить множество, нужно прибавлять или вычитать числа в том же куске кода. Рассмотрим в общем случае:

C.X := X*m + dx;

C.Y := Y*m + dy;

 
  Алгебраические фракталы. Рис. 85. Фрактал Мандельброта - student2.ru

Здесь m задет увеличение, dx - смещение по горизонтали, а dy - смещение по вертикали. Например, положив, что m=0.0001, dx=-1.2, dy=-0.3, мы получим примерно то, что изображено на рисунке (рис. 86).

Рис. 86

 
  Алгебраические фракталы. Рис. 85. Фрактал Мандельброта - student2.ru

6.5. Стохастические фракталы

Рис. 87. Стохастический фрактал

Кривая Коха как бы не была похожа на границу берега не может выступать в качестве ее модели из-за того, что она всюду одинакова, самоподобна, а в действительности это не так. Все природные объекты создаются по капризу природы, и есть случайность в этом процессе.

Фракталы при построении которых в итеративной системе случайным образом изменяются какие-либо параметры называются стохастичными. Термин "стохастичность" происходит от греческого слова, обозначающего "предположение".

Также примером случайности в природе является броуновское движение. С помощью компьютера такие процессы строить достаточно просто, т.к. он позволяет генерировать последовательности случайных чисел. Эти фракталы используются при моделировании рельефов местности и поверхности морей, процесса электролиза.

Построение ландшафта

Возьмем карту размером 512*512 точек, каждая из которых представляет собой 8-ми битное целое значение высоты и цвета. Первоначально изображение выглядит таким образом, что при вызове функции высоты в точках с координатами (u,v) она возвращает одинаковые значения в углах условной сетки точек. Т. е. w(0,0)=w(512,0)=w(0, 512)=w(512, 512). w(1,1)=w(512, 512) и т. д.

Координаты поверхности:

Координаты (u,v) описывают положение на поверхности. Всю поверхность можно представить как множество дискретных значений функции высоты h=w(u,v).

Координаты экрана:

Положение точек на экране будем описывать координатами (x,y).

Построение поверхности:

Генерация фрактальных поверхностей, по другому, называется плазма или рекурсивное разбиение и выглядит следующим образом. В начале вычисляем произвольные высоты в углах и середине карты поверхности т. е. в точках: (0,0), (512,0), (0, 512), (512, 512) (рис. 88 a,b). Затем запускаем подпрограмму вычисления высот, для которой в качестве параметров передаются размер и положение квадратного участка поверхности, в первом случае этим участком является вся карта. Подпрограмма считывает значения высот из углов квадрата полученного в качестве параметра. Вдоль каждого ребра квадрата вычисляется среднее значение двух высот по краям ребра и к полученному значению прибавляется некоторое произвольное значение, пропорциональное длине ребра, результат записывается в точку, делящую ребро пополам (рис. 88 c). Затем вычисляется высота центра квадрата путем нахождения средней высоты четырех высот углов квадрата, и к полученному значению добавляют произвольное число (рис. 88 d).

В 3-х мерном изображении этот процесс будет выглядеть следующим образом.

 
  Алгебраические фракталы. Рис. 85. Фрактал Мандельброта - student2.ru

Рис. 88

Для получения более гладких поверхностей используют метод «смазывания», который предполагает пересчет вершин поверхности по следующей формуле:

w(u,v)=k1*w(u,v)+k2*w(u+3,v-2)+k3*w(u2,v+4).

Причем k1, k2, k3 подбирают таким образом чтобы k1+k2+k3=1.

Все вычисления производятся в фиксированных точках целочисленной арифметики.

Алгебраические фракталы. Рис. 85. Фрактал Мандельброта - student2.ru

Рис. 89. Примеры фрактальных ландшафтов

Приведем программу построения стохастического фрактала «Плазма».

Алгебраические фракталы. Рис. 85. Фрактал Мандельброта - student2.ru

Рис.90. Фрактал «Плазма»

Program Plazma;

Uses CRT, Graph;

Var

Plasma : Array [0..319, 0..199] of Byte;

x, y, j: Integer;

gd, gm : Integer;

Procedure RGB(N, R, G, B:Word);

Begin

Port[$3c8]:=n;

Port[$3c9]:=R div 4;

Port[$3c9]:=G div 4;

Port[$3c9]:=B div 4;

End;

Procedure Adjust(xa,ya,x,y,xb,yb: Integer);

Var

d: Integer;

v: Real;

Begin

if plasma[x, y] <> 0 then exit;

d:=Abs(xa - xb) + Abs(ya - yb);

v:=(plasma[xa, ya] + plasma[xb, yb]) / 2 + (random - 0.5) * d * 2;

If v < 1 Then v:=1;

If v >= 255 Then v:=255;

plasma[x, y]:=Trunc(v);

End;

Procedure HalfWay(x1, y1, x2, y2: Integer);

Var

x, y: Integer;

Begin

If (x2 - x1 < 2) and (y2 - y1 < 2) Then Exit;

x:=(x1 + x2) div 2;

y:=(y1 + y2) div 2;

Adjust(x1, y1, x, y1, x2, y1);

Adjust(x2, y1, x2, y, x2, y2);

Adjust(x1, y2, x, y2, x2, y2);

Adjust(x1, y1, x1, y, x1, y2);

If Plasma[x,y]=0 Then

plasma[x,y]:=trunc((plasma[x1, y1] + plasma[x2, y1] +

plasma[x2, y2] + plasma[x1, y2]) / 4);

HalfWay(x1, y1, x, y);

HalfWay(x, y1, x2, y);

HalfWay(x, y, x2, y2);

HalfWay(x1, y, x, y2);

end;

Procedure MakePlasma;

Begin

Plasma[0, 199]:=Random(190);

Plasma[319, 199]:=Random(190);

Plasma[319, 0 ]:=Random(190);

Plasma[0, 0 ]:=Random(190);

HalfWay(0, 0, 319, 199);

End;

Begin

Asm

mov ax ,13h

int 10h

End;

Randomize;

For J:=0 To 43 Do RGB(j, 255, j*6, 0);

For J:=0 To 43 Do RGB(43+j, 255-j*6, 255, 0);

For J:=0 To 43 Do RGB(86+j, 0, 255, j*6);

For J:=0 To 43 Do RGB(129+j, 0, 255-j*6, 255);

For J:=0 To 43 Do RGB(172+j, j*6, 0, 255);

For J:=0 To 40 Do RGB(215+j, 255, 0, 255-j*6);

MakePlasma;

For x := 0 to 319 do

For y := 0 to 199 do

Mem[$0a000 : y * 320 + x] := plasma[x, y];

Readkey;

End.

Чтобы перед глазами все поплыло, мы в цикле будем менять палитру. (Переменная c любого целого типа.)

...

Begin

Asm

mov ax ,13h

int 10h

End;

Randomize;

c:=0;

MakePlasma;

For x := 0 to 319 do

For y := 0 to 199 do

Mem[$0a000 : y * 320 + x] := plasma[x, y];

Repeat

For J:=0 To 43 Do RGB((j+c) mod 256, 255, j*6, 0);

For J:=0 To 43 Do RGB((43+j+c) mod 256, 255-j*6, 255, 0);

For J:=0 To 43 Do RGB((86+j+c) mod 256, 0, 255, j*6);

For J:=0 To 43 Do RGB((129+j+c) mod 256, 0, 255-j*6, 255);

For J:=0 To 43 Do RGB((172+j+c) mod 256, j*6, 0, 255);

For J:=0 To 40 Do RGB((215+j+c) mod 256, 255, 0, 255-j*6);

inc(c);

delay(1000);

Until KeyPressed;

Readkey;

End.

Наши рекомендации