Методи поліпшення растрових зображень (47566)

Посмотреть архив целиком

МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ

Бердичівський політехнічний коледж














Контрольна робота

з предмета “ Комп’ютерна графіка

(варіант №7)

Методи поліпшення растрових зображень











м. Бердичів 2007 р.


Зміст


  1. Методи поліпшення растрових зображень

  2. Параметри виду, буфер глибини, джерело світла в бібліотеці Opengl

  3. Використовуючи команди надбудови над Opengl, створити тривимірну фігуру та забезпечити її поворот при натисненні на кнопку пробіл

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


  1. Алгоритм побудови лінії


Для побудування лінії необхідно застосувати аргумент команди glBegm - константу GL_LiNES, задаючий примітив "незалежний відрізок".

Для цього примітиву наступні в командних дужках вершини (тобто функції glvertex) задають попарно координати початку і кінця кожного відрізка прямої. Написавши коротенький алгоритм в програмному середовищі Delphi ми отримаємо лінію.


glBegin (GL_LINES);

glVertex2f (-1, 1);

glVertex2f (1 -1);

glVertex2f (-1, -1);

glVertex2f (1, 1);

glEnd;


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


glLineWidth (2. 5);


Ця функція також повинна виноситися за командні дужки, у ліній можна усувати ступінчастість, що буду виконувати команда glEnable (GL_LINE_SMOOTH); згладжувати нерівності.


glLineWidth (15);

glEnable (GL_LINE_SMOOTH);

glBegin (GL_LINES);

glVertex2f (-0. 7, 0. 7);

викликом і без виклику і подивитеся результати роботи програми з glEnable (GL_LINE_SMOOTH). Отже, константа GL_LiNES задає примітив окремих відрізків, визначених вказівкою пар вершин. Зрозуміло, що кількість вершин повинна бути парною. Наступна константа - GL_LiNE_STRip - визначає примітив, коли перераховуванні вершини послідовно з'єднуються одна за одною. Код, що приводиться, пояснює відмінність цього примітиву від попередньої.


glBegin (GL_LINE_STRIP);

glVertex2f (-l -1);

glVertex2f (-1, 1);

glVertex2f (1, 1);\

glVertex2f (l, -l); \

glEnd;


Результат - буква П по межі вікна, що задається константою GL_LiNE_Loop, також послідовно з'єднуються перераховані вершини, проте остання вершина замикається з найпершою. Якщо в попередньому прикладі використовувати GL_LiNE__ Loop, буде побудований квадрат по межі вікна. У прикладах на відрізки ми поки використовували безперервну лінію. Для малювання пунктирною лінією перед командними дужками потрібно додати наступні рядки:


glLineStipple (1 $FOFO);glEnable (GL_LINE_STIPPLE);


У функції glLinestipple перший аргумент - масштабний множник, другий аргумент задає шаблон штрихування (побітовим способом). За допомогою програмного середовища Delphi дуже легко можна побудувати - ще один приклад на використання штрихування (мал. 2. 1).


Мал. 2.1. Декілька готових шаблонів штрихових ліній




Призначена для користувача процедура drawOneLine викликається для відтворення кожного окремого відрізка:


procedure TfrmGL. drawOneLine(xl, yl x2, y2: GLfloat);

begin glBegin(GL_LINES);

glVertex2f glVertex2f glEnd;

end;

(2 * xl / ClientWidth - 1. 0, yl (2 * x2 / ClientWidth - 1. 0 y2

/ ClientHeight - 0. 5); / ClientHeight - 0. 5);


Змістовна частина коду перемальовування вікна виглядає так:


glColor3f (1. 0, 1. 0, 1. 0); // всі відрізки малюються білим

// другий рядок: малюється 3 відрізки, все з різним штрихуванням

glEnable (GL_LINE_STIPPLE);

glLineStipple (1, $0101); // точковий

drawOneLine (50. 0, 125. 0, 150. 0, 125. 0);

glLineStipple (1 $OOFF); // штрихи

drawOneLine (150. 0, 125. 0, 250. 0, 125. 0);

glLineStipple (1 $1C47); // штріхпунктір

drawOneLine (250. 0, 125. 0, 350. 0, 125. 0);// третій рядок: малюється три широкі відрізки з тим же штрихуванням

glLineWidth (5. 0); // задаємо ширину лінії

glLineStipple (1, $0101);

drawOneLine (50. 0, 100. 0, 150. 0, 100. 0);

glLineStipple (1 $00FF);

drawOneLine (150. 0, 100. 0, 250. 0, 100. 0);

glLineStipple (1 $1C47);

drawOneLine (250. 0, 100. 0, 350. 0, 100. 0);

glLineWidth (1. 0);// в першому рядку малюється 6 відрізків, шаблон "пунктир/точка/пунктир", // як частини одного довгого відрізка, без виклику процедури

drawOneLine glLineStipple (1 $1C47);

glBegin (GL_LINE_STRIP);

for i: = 0 to 6 do

glVertex2f ( 2 * (50. 0 + (i * 50. 0)) / ClientWidth - 1. 0, 75. 0 / ClientHeight);

glEnd;// Четвертий рядок - аналогічний результат, але 6 отдельньк відрізків for i: = 0 to 5 do

drawOneLine (50. 0 + i * 50. 0, 50. 0, 50. 0 + (i+l) * 50. 0, 50. 0); // п'ятий рядок - малюється один штрихпунктирний відрізок, множник = 5 glLineStipple (5 $1С47);

drawOneLine (50.0, 25.0, 350.0, 25.0);


Після виконання побудови такого алгоритму ми отримаємо з ліній картинку, що буду нагадувати бенгальський вогник.


glEnable (GL_LINE_STIPPLE) ;

For i := 1 to 100 do begin

glColor3f (random, random, random);

glLineStipple (random (5), random ($FFFF) ) ;

glBegin (GL_LINES);

glVertex2f (xpos, ypos) ;

glVertex2f (xpos + 0.5 * random * sin (random (360)),

ypos + 0.5 * random * cos (random (360)));

glEnd; end;


  1. Параметри виду, буфер глибини, джерело світла в бібліотеці Opengl


Щоб зрозуміти, що таке параметри виду нам допоможе один з примірив посібника бібліотек OpenGL. Почнемо подальше вивчення з того, що збільшимо об'єм куба. Проект з підкаталогу ExOl нам допоможе. Основна послідовність дій поміщена між командами giPushMatrix і glPopMatrix. Якщо цього не робити, то при кожному перемальовуванні вікна, наприклад, при зміні його розмірів, сцена зменшуватиметься в розмірах. Тут зустрічається нова для нас команда - giFrustum, задаюча параметри вигляду, зокрема, визначальні область відтворення в просторі. Все, що виходить за межі цієї області, відсікатиметься при відтворенні. Перші два аргументи задають координати площин відсікання зліва і справа, третій і четвертий параметри визначають координати площин відсікання знизу і зверху. Останні аргументи задають відстані до ближньої і дальньої площин відсікання, значення цих двох параметрів повинні бути позитивними - це не координати площин, а відстані від ока спостерігача до площин відсікання.


wglMakeCurrent(Canvas.Handle, hrc);

glViewport(0, 0, ClientWidth, ClientHeight);

9lPushMatrix;

glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу\

glTranslatef(0.0, 0.0, -5.0); // перенос объекта по оси 1\

9lClearColor (0.5, 0.5, 0.75, 1.0); \

glClear (GL_COLOR_BUFFER_BIT) ; \

glColor3f (1.0, 0.0, 0.5); \

glBegin (GLJTRIANGLES);\

glVertex3f (-1, -1, 0);\

glVertex3f (-1, 1, 0) ;\

glVertexSf (1, 0, h); \

glEnd; \

glPopMatnx;\SwapBuffers (Canvas.Handle);

wglMakeCurrent (0, 0) ;


На даному прикладі показаний трикутник. Тепер все, що малюється з нульовим значенням координати Z, не буде видно спостерігачу, оскільки ближню площину відсікання ми розташували на відстані трьох одиниць від ока спостерігача, розташованого в крапці (0, 0, 0). Тому перед відтворенням трикутника зміщуємо систему координат на п'ять одиниць вниз. Трикутник віддалився від спостерігача, і його вершини розташовуються вже не на межі вікна, а змістилися углиб екрану. Це нескладне міркування передує наступному прикладу - проект з підкаталогу Ех03. Для підвищення надійності роботи додатку користуємося явно одержуваним посиланням на контекст пристрою, а не значенням властивості canvas.Handle Відразу ж після отримання контексту відтворення робимо його поточним в обробнику події create форми, а безпосередньо перед видаленням звільняємо контекст в обробнику Destroy. Тепер такі параметри OpenGL, як колір фону і колір примітивів, можна задавати єдиний раз - при створенні форми, а не виконувати цю дію кожного разу при перемальовуванні екрану. На відміну від всіх попередніх проектів, в даному з'являється окремий обробник події, пов'язаної із зміною розмірів вікна. Якщо пригадати то, раніше при цій події виконувався той же код, що і при перемальовуванні вікна. У всіх прикладах, що залишилися, як правило, буде присутній окремий обробник події, пов'язаної із зміною розмірів вікна. У цьому обробнику задається область висновку і встановлюються параметри вигляду, після чого вікно необхідно перемальовувати:


procedure TfrmGL.FormResize(Sender: TObject);

begin lViewport (0, 0, ClientWidth, ClientHeight);

glLoadldentity; iFrustum (-1, 1 -1, 1, 3, 10); // видові параметри

lTranslatef (0.0, 0.0, -5.0); // початкове зрушення системи координат

InvalidateRect(Handle, nil. False);

end;


Код, пов'язаний з перемальовуванням вікна, тепер скорочується в становиться більш коректним:


Procedure TfrmGL.FormPaint(Sender: TObject);

WClear (GL_COLOR_BUFFER_BIT);

9lBegin (GLJTRIANGLES);

glVertex3f (-1, -1, 0);

glVertex3f (-l, 1, 0);

glVertex3f (1, 0, h);

glEnd;

SwapBuffers(DC);

end;


Аргументи команди giortho мають такий самий сенс, що і у giFrustum, але останні два аргументи можуть мати негативне значення. Крім цих двох команд, OpenGL надає ще декілька можливостей установки видових параметрів, наприклад, бібліотека glu містить команду giuOrtho2D. Ця команда має чотири аргументи, сенс яких такий же, як і у giortho. По своїй дії вона еквівалентна виклику giortho з вказівкою значення відстані до ближньої площини відсікання рівним мінус одиниці, і відстанню до дальньої площини відсікання рівним одиниці. Як при такій проекції виглядає куб з попередніх прикладів.


Случайные файлы

Файл
36193.rtf
96786.rtf
45469.doc
105282.rtf
VDV-1094.DOC




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.