- •Компьютерная графика Курс лекций
- •Оглавление
- •Предисловие
- •Лекция 1. Введение
- •1.1. История компьютерной графики
- •1.2.Области применения компьютерной графики
- •1.3. Классификация графических изображений
- •1.4. Виды компьютерной графики
- •1.4.1. Растровая графика
- •1.4.2. Векторная графика
- •1.4.3. Фрактальная графика
- •Лекция 2. Аппаратная база машинной графики
- •2.1. Видеосистема персонального компьютера
- •2.2. Цвет
- •2.3. Форматы графических файлов
- •Лекция 3. Отображение геометрических объектов
- •1. Двумя точками ( а и в ).
- •Лекция 4. Аппарат проецирования
- •4.1. Аксонометрические проекции
- •4.2. Способы преобразования комплексного чертежа
- •Лекция 5. Представление объектов и их машинная генерация
- •5.1. Аффинные преобразования на плоскости
- •5.2. Растровая развертка отрезка
- •3.1 Растровая развертка отрезка
- •5.3. Алгоритм вывода окружности
- •5.4. Кривая Безье
- •5.5. Отсечение отрезка
- •5.6. Закраска области, заданной цветом границы
- •5.7. Удаление невидимых линий и поверхностей
- •Алгоритм робертса
- •Лекция 6. Фрактальная графика
- •6.1. Алгоритм построения фрактала
- •6.2. Природные фракталы
- •6.3. Геометрические фракталы
- •6.4. Алгебраические фракталы
- •6 .5. Стохастические фракталы
- •Лекция 7. Графические редакторы
- •Лекция 8. СЖатие изображений
- •8.1. Необратимое сжатие
- •8.2. Обратимое сжатие
- •8.3. Общие положения алгоритмов сжатия изображений
- •8.4. Алгоритмы архивации без потерь
- •8.5. Алгоритмы архивации с потерями
- •Литература
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.
