47481 (572014), страница 2
Текст из файла (страница 2)
рис. №3
Листинг програми матиме такий вигляд:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, Menus;
type
TfrmGL = class (TForm)
procedure FormCreate (Sender: TObject);
procedure FormPaint (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure FormKeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize (Sender: TObject);
procedure FormKeyPress (Sender: TObject; var Key: Char);
private
DC: HDC; // контекст пристрою
hrc: HGLRC; // контекст відображення
ry: GLfloat; // зміна координати по У
tx: GLfloat; // зміна координати по Х
end;
var
frmGL: TfrmGL;
mode: (POINT, LINE, FILL) = FILL; // режими відображення обєкта
mx,my: byte; // коефіцієнти збільшення/зменшення
implementation
uses DGLUT;
{$R *. DFM}
procedure TfrmGL. FormPaint (Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очищення буферу кольору
glPushMatrix; // заповнюємо систему координат
glScalef (my/mx, my/mx, my/mx); // виконуємо маштабування
glRotatef (ry, 0.0, 1.0, 0.0); // виконуємо потовот
glTranslatef (tx, 0.0, 0.0); // виконуємо перенесення
case mode of // вибираємо режим відображення
POINT: glPolygonMode (GL_FRONT_AND_BACK, GL_POINT);
LINE: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
FILL: glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
end;
glutSolidSphere (1.5, 20, 20); // будуємо сферу
glScalef (mx/my, mx/my, mx/my); // повертаємо систему в початкове полож
glPopMatrix; // повертаємо систему в попереднє положення
SwapBuffers (DC); // відображуємо на екрані
end;
procedure SetDCPixelFormat (hdc: HDC);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd. dwFlags: = PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat: = ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
procedure TfrmGL. FormCreate (Sender: TObject);
begin
DC: = GetDC (Handle);
SetDCPixelFormat (DC);
hrc: = wglCreateContext (DC);
wglMakeCurrent (DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glColor3f (1.0, 0.0, 0.0);
ry: = 0.0;
tx: = 0.0;
mx: =10;
my: =10;
end;
procedure TfrmGL. FormDestroy (Sender: TObject);
begin
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;
If Key = VK_LEFT then begin
ry: = ry + 2.0;
InvalidateRect (Handle, nil, False);
end;
If Key = VK_RIGHT then begin
ry: = ry - 2.0;
InvalidateRect (Handle, nil, False);
end;
If Key = VK_UP then begin
tx: = tx - 0.1;
InvalidateRect (Handle, nil, False);
end;
If Key = VK_DOWN then begin
tx: = tx + 0.1;
InvalidateRect (Handle, nil, False);
end;
If Key = 49 then begin
mode: = POINT;
InvalidateRect (Handle, nil, False);
end;
If Key = 50 then begin
mode: = LINE;
InvalidateRect (Handle, nil, False);
end;
If Key = 51 then begin
mode: = FILL;
InvalidateRect (Handle, nil, False);
end;
end;
procedure TfrmGL. FormResize (Sender: TObject);
begin
glViewport (0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, - 1, 1, 2,9);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
// этот фрагмент нужен для придания трёхмерности
glTranslatef (0.0, 0.0, - 5.0); // перенос объекта - ось Z
glRotatef (30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef (70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y
InvalidateRect (Handle, nil, False);
end;
Для попереднього практичного завдання вашого варіанту забезпечити операцію масштабування використовуючи клавіши “+” та “-“
Для попереднього практичного завдання вашого варіанту забезпечити операцію масштабування використовуючи клавіши “+” та “-“
Потім для точного виконання завдання виконала слідуючий алгоритм дій при цьому використала згідно варіанту клавіші "+" та "-", що по умові завдання виконують наближення та відділення фігури на фоні:
procedure TfrmGL. FormKeyPress (Sender: TObject; var Key: Char);
begin
if key = '-' then mx: =mx+1;
if key = '+' then mx: =mx-1;
InvalidateRect (Handle, nil, False);
end;
end.
Список використаної літератури
-
С.В. Глушаков, Г.А. Крабе Компютерная графика, Харьков 2002
-
Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М. Горєва. - К.: Видавництво “Юніор”, 2004.
-
OpenGl, технология ставшая символов, Учебник в примерах.
-
Конспект лекцій.
-
Мережа Інтернет.














