Смекни!
smekni.com

Види комп'ютерної графіки (стр. 3 из 3)

Можна вважати істотним недоліком обмеження для полігонів (gl_polygon): можливість виводу тільки опуклих фігур. Функція Polygon GDI API Windows у цьому плані набагато досконаліша - вона рисує й неопуклі полігони.


Розмір точок можна задати викликом glPointsize (), товщину ліній - glLineWidth () Для завдання стилю ліній використовуються функції glLineStipple, glEnable і glDisable, наприклад,

причому аргументами функції glLineStipple () є кількість повторів пікселів і шаблон пунктиру.

Стиль заповнення фігур може бути заданий растровим зразком 32*32 біт.

Зверніть увагу, ми вже кілька разів використовували функції glEnable () і glDisable (). Це багатоцільові функції. Вони призначені керувати багатьма різноманітними режимами відображення.

3. Засобами бібліотеки Opengl побудувати довільну кількість довільного розміру точок на поверхні форми

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 FormKeyPress (Sender: TObject; var Key: Char);

private

hrc: HGLRC;

end;

var

frmGL: TfrmGL;

Vert: array [1. .6,1. .10] of GLfloat; // оголосили масив з папаметрами 10-ти точок

mx,my: byte; // коефіцієнти збільшення/зменшення

implementation

{$R *. DFM}

procedure TfrmGL. FormPaint (Sender: TObject);

var

i: byte;

begin

wglMakeCurrent (Canvas. Handle, hrc); // Встановили контекст відображення

glViewPort (0, 0, ClientWidth, ClientHeight); // встановили область відображення

glClearColor (0.5, 0.5, 0.5, 1.0); // задали колір фону

glClear (GL_COLOR_BUFFER_BIT); // Очистили буфер кольору

glEnable (GL_POINT_SMOOTH); // активізувати зглажування точок

glScalef (my/mx, - my/mx, 1.0); // виконуємо маштабування

for i: = 1 to 10 do

begin

glPointSize (vert [4, i]); // задали розмір точки

glColor3f (vert [1, i], vert [2, i], vert [3, i]); // задали колір для примітитів

glBegin (GL_POINTS); // розпочинаємо побудову

glVertex2f (vert [5, i],vert [6, i]); // будуємо точку

glEnd; // закінчуємо побудову

end;

glScalef (mx/my, - mx/my, 1.0); // повертаємо систему в початкове положення

SwapBuffers (Canvas. Handle); // вміст буферу виводимо на екран

wglMakeCurrent (0, 0); // вивілбняємо контекст відображення

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

var

i: byte; // кількість точок на екрані

begin

SetDCPixelFormat (Canvas. Handle); // встановили формат пікселя

hrc: = wglCreateContext (Canvas. Handle); // створили контекст вдображення

randomize; // активізувати генератор випадкових змінних

for i: = 1 to 10 do

begin

vert [1, i]: =Random (10) /10; // R встановити коефіцієнти кольору

vert [2, i]: =Random (10) /10; // G

vert [3, i]: =Random (10) /10; // B

vert [4, i]: =random (30); // pointSize

vert [5, i]: = (random (10) - random (10)) /10; // X

vert [6, i]: = (random (10) - random (10)) /10; // Y

end;

mx: =10; my: =10;

end;

11. Для попереднього практичного завдання даного варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“

Далі згідно варіанту необхідно, щоб довільна кількість точок наближалась за допомогою натиску на клавішу і таким же чином точки віддалялися тобто виконувалося маштабування. Для більшої зручності ми виберемо клавіші на клавіатурі “+” та “-", що само собою вже підрозуміває наближення та віддалення. Для вже існуючого листингу вище вказаного допишемо такий алгоритм дій:

procedure TfrmGL. FormDestroy (Sender: TObject);

begin

wglDeleteContext (hrc); // знищили контекст відображення

end;

procedure TfrmGL. FormKeyPress (Sender: TObject; var Key: Char);

begin

if key = '-' then mx: =mx+1;

if key = '+' then mx: =mx-1;

FormPaint (Sender);

end;

end.

Після написання цих команд програма буде виконувати маштабування довільної кількості точок на формі, які вказані на рис.1 та рис.2:

(рис.1)

На рис.1 показане вже згенерована програма яка виконує масштабування віддалення при натиску на клавішу “-", на рис.2 ви бачите наближення довільних точок при натиску на клавішу “+”


(рис.2)

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

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

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

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