Я взяла для виконання свого завдання програму Delphi і побудувала сферу на формі придавши їй червоного кольору, лістинг програми матиме такий вигляд:
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;
4. Для попереднього практичного завдання вашого варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“
Потім для точного виконання завдання виконала слідуючий алгоритм дій при цьому використала згідно варіанту клавіші «+» та «-», що по умові завдання виконують наближення та відділення фігури на фоні:
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.
Список використаної літератури
1. С.В. Глушаков, Г.А. Крабе Компютерная графика, Харьков 2002
2. Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За _ед.. В.М.Горєва. – К.: Видавництво “Юніор”, 2004
3. OpenGl, технология ставшая символов, Учебник в примерах
4. Конспект лекцій
5. Мережа Інтернет






