Смекни!
smekni.com

Деякі формати мультимедіа. Використання шейдерів та фракталів (стр. 3 из 3)

• крок(х4, у4, х3, у3, num)—продовжуємо стовбур;

• крок(х4, у4, х6, у6, num+l)—права гілка;

• крок(х4, у4, х7, у7, num+l) —ліва гілка.

Значення пит показує ступінь деталізації обрахування дерева. Один цикл ітерацій містить багато кроків, що відповідає одному значенню величини num. Числове значення пит можна використовувати для припинення ітеративного процесу, а також для визначення поточного кольору елементів "рослини".

Завершення циклів ітерацій у нашому алгоритмі відбувається тоді, коли довжина гілки стає менше від деякої величини lmin , наприклад, lmin = 1.

Цей фрактал при

= 2°,
= 86°, к = 0.14, к1 = 0.3 схожий на папороть (рис. 3.40).

Метод IFS використовується не тільки для створення зображень. Його використали Барнслі та Слоан для ефективного ущільнення графічних зображень при записі до файла. Основна ідея така: оскільки фрактали можуть репрезентувати дуже складні зображення за допомогою простих ітерацій, то опис цих ітерацій потребує значно меншого обсягу інформації, ніж відповідні растрові зображення. Дkя кодування зображень необхідно вирішувати обернену задачу — для зображення (або його фрагмента) підібрати відповідні коефіцієнти афінного перетворення. Цей метод використовується для запису кольорових фотографій у файли з ущільненням у десятки і сотні разів без помітного погіршення зображення. Формат таких графічних файлів було названо FIF (Fractal Image Format) і запатентовано фірмою Iterated Systems [40].


3. Засобами бібліотеки Opengl активізувати джерело світла на формі. Забезпечити операцію масштабування використовуючи клавіші “+” та “-“

object frmGL: TfrmGL

Left = 163

Top = 167

Width = 385

Height = 272

Caption = #1055#1079#1089'-504 '#1070#1088#1095#1091#1082' '#1057'.'#1051'.'

Color = clBlack

Font.Charset = RUSSIAN_CHARSET

Font.Color = clMaroon

Font.Height = -16

Font.Name = 'Times New Roman'

Font.Style = [fsBold, fsItalic]

OldCreateOrder = True

Position = poScreenCenter

OnCreate = FormCreate

OnDestroy = FormDestroy

OnKeyDown = FormKeyDown

OnPaint = FormPaint

OnResize = FormResize

PixelsPerInch = 96

TextHeight = 19

end

procedure TfrmGL.FormPaint(Sender: TObject);

begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glPushMatrix;

glRotatef(Angle, 0.0, 1.0, 0.0); // поворот на угол

glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);

OutText ('ЮРЧУК С.Л.');

glPopMatrix;

SwapBuffers(DC);

end;

procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;

begin

With frmGL do begin

Angle := Angle + 0.2;

If (Angle >= 720.0) then Angle := 0.0;

MaterialColor [0] := (720.0 - Angle) / 720.0;

MaterialColor [1] := Angle / 720.0;

MaterialColor [2] := Angle / 720.0;

InvalidateRect(Handle, nil, False);

end;

end;

procedure TfrmGL.FormCreate(Sender: TObject);

begin

Angle := 0;

DC := GetDC(Handle);

SetDCPixelFormat;

hrc := wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

wglUseFontOutlines(Canvas.Handle, 0, 255, GLF_START_LIST, 0.0, 0.15,

WGL_FONT_POLYGONS, nil);

Init;

uTimerID := timeSetEvent (1, 0, @FNTimeCallBack, 0, TIME_PERIODIC);

end;

procedure TfrmGL.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glMatrixMode(GL_PROJECTION);

glLoadIdentity;

gluPerspective(40.0, ClientWidth / ClientHeight, 1.0, 20.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity;

glTranslatef(0.0, 0.0, -8.0);

glRotatef(30.0, 1.0, 0.0, 0.0);

InvalidateRect(Handle, nil, False);

end;

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

timeKillEvent(uTimerID);

glDeleteLists (GLF_START_LIST, 256);

wglMakeCurrent(0, 0);

wglDeleteContext(hrc);

ReleaseDC(Handle, DC);

DeleteDC (DC);

end;

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

If Key = VK_ESCAPE then Close

end;

procedure TfrmGL.SetDCPixelFormat;

var

nPixelFormat: Integer;

pfd: TPixelFormatDescriptor;

begin

FillChar(pfd, SizeOf(pfd), 0);

with pfd do begin

nSize := sizeof(pfd);

nVersion := 1;

dwFlags := PFD_DRAW_TO_WINDOW or

PFD_SUPPORT_OPENGL or

PFD_DOUBLEBUFFER;

iPixelType:= PFD_TYPE_RGBA;

cColorBits:= 24;

cDepthBits:= 32;

iLayerType:= PFD_MAIN_PLANE;

end;

nPixelFormat := ChoosePixelFormat(DC, @pfd);

SetPixelFormat(DC, nPixelFormat, @pfd);

end;

end.


Список використаної літератури

1. С.В.Глушаков, Г.А.Крабе Компютерная графика, Харьков 2002

2. Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М.Горєва. – К.: Видавництво “Юніор”, 2004.

3. OpenGl, технология ставшая символов, Учебник в примерах.

4. Конспект лекцій.

5. Мережа Інтернет.