Тема:
Мета:
ТЕОРЕТИЧНІ ВІДОМОСТІ
В даній лабораторній роботі, використовуючи графічні функції бібліотеки OpenGL, генерується досить складне зображення, яке є набором простих геометричних фігур, а саме – квадратів.
Отже дана фігура складається з шести квадратів, кожен з яких є комбінацією квадратів які обертаються навколо центра і зменшуються таким чином щоб кожен наступний квадрат “входив” у попередній. Поворот квадрата здійснюється за такими правилами – малюється лінія яка зміщена по кожній з координатних осей на N-ну кількість пік селів. Наприклад – нижня лінія : один кінець зсунутий по осі Х на n-ну кількість пік селів, другий – по осі У.
Розміри квадрата визначаються спеціальною функцією яка є підібраною для конкретного випадку.
Текст програми
program Bachinsky3;
uses
Messages, Windows, OpenGL;
const
AppName = 'Bachinsky-3';
Var
dop:integer;
Window : HWnd;
Message : TMsg;
WindowClass : TWndClass;
dc : HDC;
hrc : HGLRC; // контекст воспроизведения OpenGL
MyPaint : TPaintStruct;
centreX,centreY,LongLine,Coner: integer;
//--------------my------------------
procedure Paint(CentreX,CentreY,LongLine,Coner:integer);
var Delta,HalfLongLine,
X1,X2,X3,X4,Y1,Y2,Y3,Y4:integer;
begin
while Coner>0 do Coner:=Coner-90;
Coner:=Coner+90;
Delta:=(LongLine*Coner div 90);
HalfLongLine:=LongLine div 2;
X1:=CentreX-HalfLongLine;
Y1:=CentreY-HalfLongLine+Delta;
X2:=X1+Delta;
Y2:=CentreY+HalfLongLine;
X3:=CentreX+HalfLongLine;
Y3:=Y2-Delta;
X4:=X3-Delta;
Y4:=CentreY-HalfLongLine;
// glClear (GL_COLOR_BUFFER_BIT);
glEnable(GL_LINE_SMOOTH);
glColor3f (0.9,0.2,1.0);
glbegin(GL_LINES);
glVertex2f(x1/100,y1/100);
glVertex2f(x2/100,y2/100);
glVertex2f(x2/100,y2/100);
glVertex2f(x3/100,y3/100);
glVertex2f(x3/100,y3/100);
glVertex2f(x4/100,y4/100);
glVertex2f(x4/100,y4/100);
glVertex2f(x1/100,y1/100);
glend;
end;
//----------------------------------
// Процедура заполнения полей структуры PIXELFORMATDESCRIPTOR
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor; // данные формата пикселей
nPixelFormat : Integer;
Begin
With pfd do begin
nSize := sizeof (TPixelFormatDescriptor); // размер структуры
nVersion := 1; // номер версии
dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL; // множество битовых флагов, определяющих устройство и интерфейс
iPixelType := PFD_TYPE_RGBA; // режим для изображения цветов
cColorBits := 16; // число битовых плоскостей в каждом буфере цвета
cRedBits := 0; // число битовых плоскостей красного в каждом буфере RGBA
cRedShift := 0; // смещение от начала числа битовых плоскостей красного в каждом буфере RGBA
cGreenBits := 0; // число битовых плоскостей зелёного в каждом буфере RGBA
cGreenShift := 0; // смещение от начала числа битовых плоскостей зелёного в каждом буфере RGBA
cBlueBits := 0; // число битовых плоскостей синего в каждом буфере RGBA
cBlueShift := 0; // смещение от начала числа битовых плоскостей синего в каждом буфере RGBA
cAlphaBits := 0; // число битовых плоскостей альфа в каждом буфере RGBA
cAlphaShift := 0; // смещение от начала числа битовых плоскостей альфа в каждом буфере RGBA
cAccumBits := 0; // общее число битовых плоскостей в буфере аккумулятора
cAccumRedBits := 0; // число битовых плоскостей красного в буфере аккумулятора
cAccumGreenBits := 0; // число битовых плоскостей зелёного в буфере аккумулятора
cAccumBlueBits := 0; // число битовых плоскостей синего в буфере аккумулятора
cAccumAlphaBits := 0; // число битовых плоскостей альфа в буфере аккумулятора
cDepthBits := 32; // размер буфера глубины (ось z)
cStencilBits := 0; // размер буфера трафарета
cAuxBuffers := 0; // число вспомогательных буферов
iLayerType := PFD_MAIN_PLANE;// тип плоскости
bReserved := 0; // число плоскостей переднего и заднего плана
dwLayerMask := 0; // игнорируется
dwVisibleMask := 0; // индекс или цвет прозрачности нижней плоскости
dwDamageMask := 0; // игнорируется
end;
nPixelFormat := ChoosePixelFormat (hdc, @pfd); // запрос системе - поддерживается ли выбранный формат пикселей
SetPixelFormat (hdc, nPixelFormat, @pfd); // устанавливаем формат пикселей в контексте устройства
End;
function WindowProc (Window : HWnd; Message, WParam : Word;
LParam : LongInt) : LongInt; stdcall;
var i,j,param,loop1,loop2:integer;
k,koef:real;
Begin
WindowProc := 0;
case Message of
wm_Create:
begin
dc := GetDC (Window);
SetDCPixelFormat (dc); // установить формат пикселей
hrc := wglCreateContext (dc); // создаёт контекст воспроизведения OpenGL
end;
wm_Paint:
begin
BeginPaint (Window, MyPaint);
wglMakeCurrent (dc, hrc); // устанавливает текущий контекст воспроизведения
glClearColor (0.2,0.5, 0.5, 0.5); // определение цвета фона
glClear (GL_COLOR_BUFFER_BIT); // установление цвета фона
//--------------
centrex:=-50;
for loop1:=1 to 2 do begin
centrey:=-50;
for loop2:=1 to 2 do begin
coner:=65;longline:=100;
i:=0;j:=1;k:=1.2; param:=4;
while i<coner do begin
k:=k*0.98;
koef:=k/5*i;
j:=round(koef);
longline:=longline-j;
paint(centrex,centrey,longline,i);
i:=i+param;
end;
centrey:=centrey+100;
end;
centrex:=centrex+100;
end;
//--------------
{************************************************************************}
wglMakeCurrent (dc, 0); // перед завершением работы необходимо,
// чтобы контекст никем не использовался
EndPaint (Window, MyPaint);
end;
wm_Destroy :
begin
wglDeleteContext (hrc); // удаление контекста воспроизведения
PostQuitMessage (0);
Exit;
end;
end; // case
WindowProc := DefWindowProc (Window, Message, WParam, LParam);
End;
Begin
With WindowClass do
begin
Style := cs_HRedraw or cs_VRedraw;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := 0;
hCursor := LoadCursor (0, idc_Arrow);
lpszClassName := AppName;
end;
RegisterClass (WindowClass);
Window := CreateWindow (AppName, AppName,
ws_OverLappedWindow or ws_ClipChildren
or ws_ClipSiBlings, // обязательно для OpenGL
cw_UseDefault, cw_UseDefault,
cw_UseDefault, cw_UseDefault,
HWND_DESKTOP, 0, HInstance, nil);
ShowWindow (Window, CmdShow);
UpdateWindow (Window);
While GetMessage (Message, 0, 0, 0) do begin
TranslateMessage (Message);
DispatchMessage (Message);
end;
Halt (Message.wParam);
end.
Висновок: На лабораторній роботі я ознайомився з можливостями OpenGL. Виконав завдання попередньої лабораторної роботи з використанням цієї бібліотеки.