47566 (572035)

Файл №572035 47566 (Методи поліпшення растрових зображень)47566 (572035)2016-07-29СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

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

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

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

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

(варіант №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 з вказівкою значення відстані до ближньої площини відсікання рівним мінус одиниці, і відстанню до дальньої площини відсікання рівним одиниці. Як при такій проекції виглядає куб з попередніх прикладів.

Зверніть увагу, що тут відсутнє початкове зрушення по осі Z:

procedure TfrmGL.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glLoadldentity;

gluOrtho2D (-2, 2 -2, 2); // задаємо перспективу

glRotatef (30.0, 1.0, 0.0, 0.0); // поворот об'єкту - вісь X

glRotatef (60.0, 0.0, 1.0, 0.0); // поворот об'єкту - вісь Y

InvalidateRect(Handle, nil, False);end;

Куб малюється навколо ока спостерігача і проектується на площину екрану. Згідно установкам цієї команди передня і задня частини нашого куба частково обрізаються. Наступна команда, яку ми розглянемо, мабуть, найбільш популярна в плані використання для первинного завдання видових параметрів. Команда gluPerspective, як ясно з її назви, також знаходиться в бібліотеці glu. Проект прикладу міститься в підкаталозі Ех09, а отримується в результаті роботи програми картинка показана на мал.1.

мал.1

У них можна міняти значення всіх аргументів команди gluLookAt, і оскільки цих аргументів порівняно багато, я створив допоміжну форму, в полях редагування якої виводяться і задаються користувачем координати всіх дев'яти аргументів Рекомендую обов'язково попрактикувати з цим прикладом, щоб "відчути" роботу параметрів Звернете увагу, що, як підкреслюється в документації, вектор "up" не повинен бути паралельним лінії, що сполучає точку зору і контрольну крапку.

Буфер глибини

При створенні контексту відтворення до числа параметрів формату пікселів входять розміри розділів пам'яті, що надається для потреб OpenGL, або буферів. Крім буферів кадру, в OpenGL присутні ще три буфери: буфер глибини, буфер трафарету і допоміжний буфер. Для спеціальних потреб можуть використовуватися ще буфер вибору і буфер зворотного зв'язку, вони готуються користувачем у міру потреби. Як ясно з його назви, він використовується для передачі простору При відтворенні кожного піксела в цей буфер записується інформація про значення координати Z піксела, так звана віконна Z. Якщо на піксел доводиться декілька крапок, на екран виводиться крапка з найменшим значенням цієї координати. При просторових побудовах відмова від використання буфера глибини приводить до невірної передачі простору. З буфером глибини пов'язані дві команди: glDepthFunc І glDepthRange. Хоч вони застосовуються досить рідко, уявлення про них мати не перешкодить. Перша з цих команд задає правило, по якому відбувається порівняння значення віконного Z перед виведенням піксела. За умовчанням встановлено значення GL_LESS - виводити на екран крапки з мінімальним значенням віконної Z. Решта значень призводить найчастіше до того, що взагалі нічого не буде виведено. Друга команда задає розподіл віконної координати Z при перекладі з нормалізованих координат у віконні.

Джерело світла

Попередні приклади навряд чи можуть задовольнити кого-небудь через свою невиразність. Мальований кубик швидше вгадується, всі грані покриті монотонним кольором, за яким втрачається простір. Щоб збільшити реалізм одержуваних побудов. Ось в наступному прикладі кубик малюється реалістичніше - мал. 2.

Мал. 2

При створенні вікна включається джерело світла:

glEnable (GL_LIGHTING); // вирішуємо роботу з освітленістю

glEnable(GL_LIGHTO); // включаємо джерело світла

Це мінімальні дії для включення джерела світла. Тепер в сцені присутнє одне джерело світла з ім'ям 0. При необхідності можна "встановити" декілька джерел, для цього так само використовується команда glEnable, наприклад:

glEnable (GL_LIGHT1); // включаємо джерело світла 1

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

Характеристики

Тип файла
Документ
Размер
1,64 Mb
Учебное заведение
Неизвестно

Тип файла документ

Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.

Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.

Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.

Список файлов ответов (шпаргалок)

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6721
Авторов
на СтудИзбе
285
Средний доход
с одного платного файла
Обучение Подробнее