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


Перетворення координат, операції масштабування в бібліотеці Opengl

МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівськийполітехнічний коледж
КОНТРОЛЬНАРОБОТА
з предмета“Комп’ютерна графіка”
(варіант №8)
Перетворення координат,операції масштабування
в бібліотеці Opengl
м. Бердичів 2007 р.

1. Перетворення координат:афінне перетворення на площині, тривідерне афінне перетворення
Спочатку розглянемо загальні питання перетвореннякоординат. Нехай задана n-вимірна система координат у базисі (k1 ,k2, ..., kn),яка описує положення точки у просторі за допомог гою числових значень kі. У КГнайчастіше використовуються двовимірна (п = 2) та тривимірна (п = 3) системикоординат.
Якщо задати іншу, N-вимірну, систему координат у базисі(т1, т2, ..., mN), і поставити задачу визначення координат у новій системі,знаючи координати в старій, то рішення (якщо воно існує) можна записати утакому вигляді:
/>
де fi— функція перерахування i-ї координати, аргументами єкоординати у системі ki. Можна поставити й обернену задачу: по відомихкоординатах (m1, т2,… mN), визначити координати (к1, к2, ..., кn). Рішенняоберненої задачі запишемо так:
/>
де Fi — функції оберненого перетворення.
У випадку, коли розмірності систем координат не збігаються(п N), здійснити однозначне перетворення координат найчастіше не вдається.Наприклад, за двовимірними екранними координатами не можна без додаткових умоводнозначно визначити тривимірні координати об'єктів, що відображаються.
Якщо розмірності систем збігаються (n = N), то такожможливі випадки, коли не можна однозначно вирішити пряму або обернену задачі.Перетворення координат класифікують:
• за системами координат — наприклад, перетворення зполярної системи у прямокутну;
• за видом функції перетворення .
За видом функцій перетворення розрізняють лінійні танелінійні перетворення. Якщо
при усіх i= і, 2, ..., N функції fi — лінійні відносноаргументів (k1 ,k2, ..., kn), тобто
/>
де aij — константи, то такі перетворення називаютьсялінійними, а при n = N— афінними. Якщо хоча б для одного i функція fi єнелінійною відносно (k1 ,k2, ..., kn), тоді перетворення координат у цілому єнелінійним. Наприклад, перетворення
/>
нелінійне, оскільки є добуток ху у виразі для Y. Тим, хтоцікавиться математичними аспектами, що відносяться до систем координат іперетворення систем координат, можна порекомендувати такі книги, як [15, 23].
Лінійні перетворення наглядно записуються в матричнійформі:

/>
Тут матриця коефіцієнтів (аіj) множиться наматрицю-стовпець (ki), й у результаті матимемо матрицю-стовпець (mi).
Ми й далі часто будемо використовувати множення матриць,тому зробимо невеличкий екскурс у матричну алгебру. Для двох матриць — матриціА розмірами (т*п) та В — (п*р):
/>
матричним добутком є матриця С = АВ розмірами (т*р)
/>
для якої елементи cij обраховуються за формулою /> .
Правило обчислення елементів матриці С можна легкозапам'ятати за назвою «рядок на стовпець». І дійсно, для обчисленнябудь-якого елемента cij необхідно помножити елементи і-го рядка матриці А наелементи j -го стовпця матриці В.

/>
Добуток матриць визначається тільки для випадку, коликількість стовпців матриці А дорівнює кількості рядків матриці В. Більшдокладно з матрицями ви можете ознайомитися в математичній літературі,наприклад, у [5]. Тепер повернемося знову до перетворень координат. Розглянемобільш докладно деякі окремі типи перетворень.
Афінне перетворення наплощині
Задамо якусь двовимірну систему координат (х, у). Афіннеперетворення на площині описується формулами
/>
де А, В, ..., F — константи. Значення (X, Y) можнарозглядати як координати в новій системі координат.
Обернене перетворення (X, Y) у (х, у) також є афінним:
/>
Афінне перетворення зручно записувати в матричному вигляді.Константи А, В,… F утворюють матрицю перетворення, котра, будучи помноженана матрицю-стовпець координат (х, у) дає матрицю-стовпець (X, У). Однак щобурахувати константи С та F, необхідно перейти до так званих одноріднихкоординат — додамо ще один рядок у матрицях координат:
/>
Матричний запис дає можливість наочно описувати декількаперетворень, що йдуть одні за одними. Наприклад, якщо необхідно спочаткувиконати перетворення
/>
а потім — інше перетворення
/>
то це можна описати як
/>
Однак замість двох перетворень можна виконати тільки одне
/>
де матриця С дорівнює добутку ВА.
Тепер розглянемо окремі випадки афінного перетворення.
1.  Паралельний зсув координат (рис. 2.1).
/>
/>
У матричній формі:
/>
Обернене перетворення:
/>
2.  Розтягнення-стискання осей координат (рис. 2.2).
/>
/>
/>
Обернене перетворення:
Коефіцієнти кх і кy можуть бути від'ємними. Наприклад, кх =-1 відповідає дзеркальному відбиттю відносно осі у.
3.  Поворот (рис. 2.3).

/>
Обернене перетворення відповідає повороту системи (X, Y) накут (-/>).
/>
Властивості афінного перетворення
• Будь-яке афінне перетворення може бути представлене якпослідовність операцій з числа вказаних найпростіших: зсув,розтягнення/стискання та поворот.
• Зберігаються прямизна лінії, паралельність прямих,відношення довжин відрізків, які лежать на одній прямій, та співвідношення площфігур.
2. Операції масштабування,переносу, повороту в бібліотеці Opengl
Ми вже знаємо, що межі області висновку лежать в межах від-1 до 1 Це може привести до незручності при підготовці зображень На щастя,OpenGL надає зручний засіб на цей випадок – масштабування. Розберемо його на прикладі програми побудови фігури, показаної на рис2. 8.Для зміни масштабу використовується команда glScalef із трьомааргументами, що є масштабними множниками для кожної з осей. Наприклад, якщоперед командними дужками вставимо рядок glScalef (0. 5, 0. 5, 1. 0); то буденамальована зменшена в два рази фігура (готовий проект розташовується впідкаталозі Ex50).После команд малювання необхідно відновити нормальниймасштаб, т. e в даному випадку додати рядок:
glScalef (2. 0, 2. 0, 1. 0);.
Є і інший спосіб запам'ятовування/відновлення поточногомасштабу, але | про нього ми поговоримо пізніше. Відновлювати масштаб необхіднодля того, щоб кожне подальше звернення до обробника перемальовування екрану неприводило, наводило б до послідовного зменшення/збільшення зображення Упринципі, можна для того, щоб звернутися до рядка єдиний раз в ході роботизастосування.
Масштабні множники можуть мати негативні значення, прицьому зображення перевертається по відповідній осі. Ілюструючи цю властивістьпроект перебуває в підкаталозі Ex51.
При двовимірних побудовах значення коефіцієнта по осі Zбайдуже, одиниця узята без особливих міркувань.
Для повороту використовується команда glRotatef із чотирмааргументами: кут повороту, в градусах, і вектор повороту, три дійсні числа.
Для двовимірних побудов найбільш наочний поворот по осі Z,чим я і користуюся в прикладах, що наводяться. У попередньому прикладі передкомандними дужками вставте рядок:
glRotatef (5, 0. 0, 0. 0, 1. 0);
і створіть обробник події Keypress з єдиною командоюRefresh. Тепер при натисненні будь-якої клавіші вікно перемальовувалося, прицьому кожного разу фігура обертається на п'ять градусів по осі Z (проект ізпідкаталогу Ex52). Тут треба звернути увагу на дві речі: на те, що припозитивному значенні компоненти вектора поворот здійснюється проти годинниковоїстрілки і те, що важливо не саме значення компоненти, а її знак і нерівність їїнулю. Хоча ми поки обмежуємося площинними побудовами поворот по будь-якій зосей позначається на відтворній картинці. Перевірте: при повороті по осях X і Yми одержуємо правильну картинку в проекції з урахуванням повороту по осях.
Поворот часто використовується при побудовах тому важливо розібратисяв ньому досконально. Точно так, як і було з масштабом, поворот діє на всенаступні команди відтворення, так що при необхідності поточний станвідновлюється зворотним поворотом. Наприклад, якщо треба намалювати поверненийна 45 градусів квадрат, т e. ромб, то код повинен виглядати так (готовий проектможете узяти в підкаталозі Ex53):
glRotatef (45, 0. 0, 0. 0, 1. 0);
glBegin (GL_POLYGON);
glVertex2f (-0. 6 -0. 1);
glVertex2f (-0. 6, 0. 4);
glVertex2f (-0. 1, 0. 4);
glVertex2f (-0. 1 -0. 1);
glEnd; lRotatef (-45, 0. 0, 0. 0, 1. 0);
Цей приклад дуже цікавий і ось чому. Видалимо відновленнякута повороту і запустимо додаток. Побачимо не ромб, а квадрат. При уважномурозгляді виявимо, що квадрат був повернений двічі Відбулося це тому, що відразупісля появи вікна на екрані (функція API showWindow) відбувається йогоперемальовування (функція API updateWindow). Якщо ви були уважні, то могливідмітити, що такий же ефект спостерігався і в попередньому прикладі. При виконанніоперації повороту можна запитати: повертається зображення або точка зору? Мибудемо для ясності вважати, що повертається саме зображення. Наступний прикладпояснить це.
Точна відповідь такої всі об'єкти в OpenGL малюються вточці відліку системи координат, а команда glRotate здійснює поворот системикоординат.
Намалюємо дві фігури: квадрат і ромб, причому ромботримаємо шляхом повороту квадрата. Текст програми буде таким (проект з|із|підкаталогу Ex54):
glRotatef (45, 0. 0, 0. 0, 1. 0); glBegin (GL_POLYGON);
glVertex2f (-0. 6 -0. 1);
glVertex2f (-0. 6, 0. 4);
glVertex2f (-0. 1, 0. 4);
glVertex2f (-0. 1 -0. 1);
glEnd;
glRotatef (-45, 0. 0, 0. 0, 1. 0);
glBegin (GL_POLYGON);
glVertex2f (0. 1 -0. 1);
glVertex2f (0. 1, 0. 4);
glVertex2f (0. 6, 0. 4);
glVertex2f (0. 6 -0. 1);
glEnd;
Так само нам доведеться поступати завжди, коли на екрані присутнідекілька об'єктів, повернених щодо один одного: перед малюванням черговогооб'єкту здійснювати поворот, а після малювання — повертати точку зору абоздійснювати наступний поворот з урахуванням поточного положення точки зору.Будь ласка, будьте уважні! Користувачі OpenGL, що починають, постійно ставлятьпитання, як повернути примітив, не повертаючи решту примітивів. Ще один разперечитайте попередній абзац На закінчення розмови про поворот розглянетепроект (підкаталог Ex55) заснований на прикладі диском. При натиснутій кнопціабо русі курей, сміття відбувається перемальовування вікна і поворот диска на60 градусів. Щоб ви могли оцінити переваги використання«низькорівневих» прийомів, вікно перемальовувалося в цих випадкахпо-різному:
procedure TfrmGL. FormKeyPress(Sender: TObject; var Key:Char);
begin
Refresh
end;
procedure TfrmGL. FormMouseMove(Sender: TObject; Shift:TShiftState; X, Y: Integer);
begin
InvalidateRect(Handle, nil, False);
end;
При натисненні кнопки добре видно мерехтіння на поверхнівікна, якого не з'являється при русі покажчика миші по його поверхні.Перенесення точки зору (системи координат) здійснюється командою glTranslatef зтрьома аргументами — величинами переносу для кожної з осей. Все сказане зприводу відновлення точки зору справедливо і відносно переносу. Розгляньтеприклад з підкаталогу Ex56, що ілюструє використання перенесення системикоординат, використання повороту і перенесення — це найчастіше івикористовується при побудовах.
Варто розібрати цей приклад докладніше. У циклі шість разіввідбувається перенесення і поворот системи координат:
glTranslatef (-0. 3, 0. 3, 0. 0);
glRotatef (60, 0, 0, 1);
Кружечки малюються в поточній точці відліку системикоординат, щодо якої відбуваються кожного разу перетворення. Після закінченняциклу точка зору повертається точно в початкове положення, тому додатковихманіпуляцій із системою координат не вимагається. Перед циклом робимоперенесення для вирівнювання картинки на екрані:

glTranslatef (0. 4, 0. 1, 0. 0);
Після циклу, звичайно, потрібно відновити первиннеположення системи координат:
glTranslatef (-0. 4 -0. 1, 0. 0);.
3.        Засобами бібліотеки Openglактивізувати джерело світла на формі
/>
(рис. 1)
unit frmMain;
interface
uses
Windows, Messages, Classes,Graphics, Forms, ExtCtrls, Menus,
Controls, Dialogs, SysUtils,
OpenGL;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender:TObject);
procedure FormResize(Sender:TObject);
procedure FormDestroy(Sender:TObject);
procedure FormPaint(Sender:TObject);
procedure FormKeyDown(Sender:TObject; var Key: Word;
Shift: TShiftState);
private
DC: HDC;
hrc: HGLRC;
Angle: GLfloat;
uTimerId: uint;
MaterialColor: Array[0..3] ofGLfloat;
procedure Init;
procedure SetDCPixelFormat;
end;
const
GLF_START_LIST = 1000;
var
frmGL: TfrmGL;
implementation
uses mmSystem;
{$R *.DFM}
const
stripeImageWidth = 32;
var
stripeImage: Array[0..3*stripeImageWidth-1] of GLubyte;
procedure makeStripeImage;
var
j: GLint;
begin
For j := 0 to stripeImageWidth — 1do begin
If j
then stripeImage[3*j] := 255
else stripeImage[3*j] := 0;
If j > 4
then stripeImage[3*j + 1] := 255
else stripeImage[3*j + 1] := 0;
stripeImage[3*j+2] := 0;
end;
end;
procedure OutText (Litera:PChar);
begin
glListBase(GLF_START_LIST);
glCallLists(Length (Litera),GL_UNSIGNED_BYTE, Litera);
end;
procedure TfrmGL.Init;
const
sgenparams: Array [0..3] ofGLfloat = (1.0, 1.0, 1.0, 0.0);
begin
glEnable(GL_DEPTH_TEST);//разрешаем тест глубины
glEnable(GL_LIGHTING); //разрешаем работу с освещенностью
glEnable(GL_LIGHT0); // включаемисточник света
makeStripeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D, 0, 3,stripeImageWidth, 0,
GL_RGB, GL_UNSIGNED_BYTE,@stripeImage);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_S, GL_OBJECT_PLANE,@sgenparams);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_1D);
end;
procedure TfrmGL.FormPaint(Sender:TObject);
begin
glClear(GL_COLOR_BUFFER_BIT orGL_DEPTH_BUFFER_BIT);
glPushMatrix;
glRotatef(Angle, 0.0, 1.0, 0.0);// поворот на угол
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE, @MaterialColor);
OutText ('Включення світла');
glPopMatrix;
SwapBuffers(DC);
end;
procedure FNTimeCallBack(uTimerID,uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
With frmGL do begin
Angle := Angle + 0.2;
If (Angle >= 720.0) then Angle:= 0.0;
MaterialColor [0] := (720.0 — Angle) / 720.0;
MaterialColor [1] := Angle /720.0;
MaterialColor [2] := Angle /720.0;
InvalidateRect(Handle, nil,False);
end;
end;
procedureTfrmGL.FormCreate(Sender: TObject);
begin
Angle := 0;
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
wglUseFontOutlines(Canvas.Handle,0, 255, GLF_START_LIST, 0.0, 0.15,
WGL_FONT_POLYGONS, nil);
Init;
uTimerID := timeSetEvent (1, 0,@FNTimeCallBack, 0, TIME_PERIODIC);
end;
procedureTfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, ClientWidth /ClientHeight, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -8.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
InvalidateRect(Handle, nil, False);
end;
procedureTfrmGL.FormDestroy(Sender: TObject);
begin
timeKillEvent(uTimerID);
glDeleteLists (GLF_START_LIST,256);
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
end;
procedure TfrmGL.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
with pfd do begin
nSize := sizeof(pfd);
nVersion := 1;
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
iPixelType:= PFD_TYPE_RGBA;
cColorBits:= 24;
cDepthBits:= 32;
iLayerType:= PFD_MAIN_PLANE;
end;
nPixelFormat := ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC, nPixelFormat,@pfd);
end;
end.
Завдання №4 (11)
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.        Блінова Т.О., Порєв В.М. Комп’ютерна графіка / Заред. В.М. Горєва. – К.: Видавництво“Юніор”, 2004. – 456с., іл.
2.        С.В. Глушаков,Г.А. Крабе Компютерная графика,Харьков 2002
3.        OpenGl, технология ставшая символов, Учебник впримерах.
4.        Конспект лекцій.


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

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

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

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