Реферат по предмету "Информатика, программирование"


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

МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівський політехнічний коледж
Контрольна робота
з предмета “ Комп’ютерна графіка ”
(варіант №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, ylx2, 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;
2.        Параметри виду,буфер глибини, джерело світла в бібліотеці 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;
Код,пов'язаний з перемальовуванням вікна, тепер скорочується в становиться більшкоректним:
ProcedureTfrmGL.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
Покинемає сенсу використовувати додаткові джерела світла, це ніяк не вплине наодержувані картинки, оскільки всі джерела світла, що додаються, використовуютьустановки, прийняті за умовчанням, і нічим не відрізняються один від одного.При малюванні кожної сторони куба задається вектор нормалі, використовуванийдля розрахунку колірних параметрів кожного пікселя. Для скорочення коду з шестисторін куба залишаємо шість,  три безпосередньо видимі спостерігачу.
glBegin(GL_QUADS);
glNormal3f(0.0, 0. 0, 1. 0);\
glVertex3f(1.0, 1. 0, 1. 0);\
glVertex3f(-1.0, 1. 0, 1. 0);\
glVertex3f(-1.0 -1. 0, 1. 0);\
glVertex3f(1.0 -1. 0, 1. 0); \
glEnd;\
glBegin(GL_QUADS);\
glNormal3f(-1.0, 0. 0, 0. 0);\
glVertex3f(-1.0, 1. 0, 1. 0);\
glVertex3f(-1.0, 1. 0 -1. 0);
glVertex3f{-1.0 -1. 0 -1. 0)
glVertex3f(-1.0-1. 0,1. 0);
glEnd;
glBegin(GL_QUADS);
glNormal3f(0.0, 1. 0, 0. 0);
glVertex3f(-1.0, 1. 0 -1. 0);
glVertex3f(-1.0, 1. 0, 1. 0);
glVertex3f(1.0, 1. 0, 1. 0);
glVertex3f(1.0, 1. 0 -1. 0);
glEnd;
Узаголовку вікна виводить це одержуване при створенні вікна, за допомогоюкоманди glGet:
glGetintegerv(GL_MAX_LIGHTS, @wrk);
Caption:= intToStr (wrk);
Векторанормалей будуються перпендикулярно кожній стороні куба. Внаслідок того, що нашкубик будується навколо крапки (0, 0, 0), аргументи glNomal3f в даному випадкуспівпадають з точкою перетину діагоналей кожної грані куба.
glNormal3f(-1.0, 0. 0, 0. 0);
Де бне розташовувався в просторі майданчик, вона освітлюється одноманітно, щобможна було поглянути на майданчик з різних точок зору. Якщо ми дивимося назадню сторону майданчика, то бачимо, що вона забарвлюється чорним кольором. Удеяких ситуаціях необхідно, щоб при такому положенні точки зору спостерігача примітивне відображався взагалі, наприклад, при відтворенні об'єктів, утворюючихзамкнутий об'єм, немає необхідності витрачати час на відтворення примітивів,свідомо нам не видимих, раз вони повернені до нас задньою стороною, майданчикне малюється, якщо повернена до спостерігача задньою стороною. Для цьогонеобхідно включити відсікання задніх сторін багатокутників:
glEnable (GL_CULL_FACE);
КомандаglcullFace дозволяє задавати, які сторони при цьому піддаються відсіканню,передні або задні. Зрозуміло, що за умовчанням пропонується відсікати задністорони. Протилежне правило відсікання можна встановити так:
glCullFace (GL_FRONT);

3. Використовуючикоманди надбудови над OpenGl створити тривимірну фігуру та забезпечити їїповорот при натисненні на кнопку пробіл
 
Я взяла для виконання свого завдання програму 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 orGL_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_WINDOWor PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat(hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat,@pfd);
end;
procedureTfrmGL.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;
procedureTfrmGL.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;
procedureTfrmGL.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. Для попереднього практичного завдання вашого варіантузабезпечити операцію маштабування використовуючи клавіши “+” та “-“
Потім для точного виконання завдання виконала слідуючийалгоритм дій при цьому використала згідно варіанту клавіші «+» та «-», що поумові завдання виконують наближення та відділення фігури на фоні:
procedureTfrmGL.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. Мережа Інтернет


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.