3. Засобами бібліотеки Opengl забезпечити зміну кольору створеної точки при натисненні лівої кнопки миші

(рис.1)

(рис. 2)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

OpenGL;

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;

quadObj : GLUquadricObj;

end;

var

frmGL: TfrmGL;

mode : (POINT, LINE, FILL, SILHOUETTE) = FILL;

gluobj : (SPHERE, CONE, CYLINDER, DISK) = SPHERE;

orientation : (OUTSIDE, INSIDE) = OUTSIDE;

normals : (NONE, FLAT, SMOOTH) = SMOOTH;

implementation

{$R *.DFM}

procedure TfrmGL.FormPaint(Sender: TObject);

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета

glPushMatrix;

glRotatef (ry, 0.0, 1.0, 0.0);

glTranslatef (tx, 0.0, 0.0);

case mode of

POINT : gluQuadricDrawStyle (quadObj, GLU_POINT);

LINE : gluQuadricDrawStyle (quadObj, GLU_LINE);

FILL : gluQuadricDrawStyle (quadObj, GLU_FILL);

SILHOUETTE : gluQuadricDrawStyle (quadObj, GLU_SILHOUETTE);

end;

case orientation of

INSIDE : gluQuadricOrientation (quadObj, GLU_INSIDE);

OUTSIDE : gluQuadricOrientation (quadObj, GLU_OUTSIDE);

end;

case normals of

NONE : gluQuadricNormals (quadObj, GLU_NONE);

FLAT : gluQuadricNormals (quadObj, GLU_FLAT);

SMOOTH : gluQuadricNormals (quadObj, GLU_SMOOTH);

end;

case gluobj of

SPHERE : gluSphere (quadObj, 1.5, 10, 10);

CONE : gluCylinder (quadObj, 0.0, 1.0, 1.5, 10, 10);

CYLINDER : gluCylinder (quadObj, 1.0, 1.0, 1.5, 10, 10);

DISK : gluDisk (quadObj, 0.0, 1.5, 10, 5);

end;

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);

quadObj := gluNewQuadric;

ry := 0.0;

tx := 0.0;

end;

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

gluDeleteQuadric (quadObj);

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

Inc (mode);

If mode > High (mode) then mode := Low (mode);

InvalidateRect(Handle, nil, False);

end;

If Key = 50 then begin

Inc (gluobj);

If gluobj > High (gluobj) then gluobj := Low (gluobj);

InvalidateRect(Handle, nil, False);

end;

If Key = 51 then begin

If orientation = INSIDE

then orientation := OUTSIDE

else orientation := INSIDE;

InvalidateRect(Handle, nil, False);

end;

If Key = 52 then begin

Inc (normals);

If normals > High (normals) then normals := Low (normals);

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.


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

 

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

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

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

4.  Конспект лекцій з предмету «Комп’ютерна графіка».


Информация о работе «Адитивна кольорова модель RGB»
Раздел: Информатика, программирование
Количество знаков с пробелами: 19050
Количество таблиц: 0
Количество изображений: 15

Похожие работы

Скачать
106641
28
1

... фотонасвітлювачі. 4. Офсетна попередньо чутлива пластина Для виготовлення друкарських офсетних форм позитивного копіювання. Схема технологічного процесу виготовлення офсетних друкарських форм для друкування журнальної продукції Ознайомлення з оригіналом і бажаннями замовника Складання тексту Сканування і обробка чорно-білих ілюстрацій Верстка журнальних сторінок ...

Скачать
15403
0
1

... монітора комп’ютера. У цій системі використовуються три основних кольори: червоний, зелений і синій (RGB). Якщо їх змішати у рівній пропорції, вони утворять білий колір, а при змішуванні в різних пропорціях – будь-який інший. В поліграфічних системах адитивний синтез має місце у комбінованому вигляді разом з субтрактивним у автотипних растрових видах друку. У системі субтрактивних кольорів ...

0 комментариев


Наверх