Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posobie КГ1.doc
Скачиваний:
9
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

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-х мерном изображении этот процесс будет выглядеть следующим образом.

Рис. 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.

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

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

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

Рис.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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]