7.160101.1381.03 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
Лабораторная работа №3 Аффинные преобразования в 2x- и 3x-мерной графики. |
Лim |
Лисm |
Листів |
|||||||||
Студент |
20.04 |
1 |
6 |
|||||||||
НУК |
||||||||||||
Викладач |
Покровский |
|||||||||||
Лабораторная работа №3 Тема: Применение аффинных преобразований к сдвигу, повороту, переносу, отражению, и проектирования, 2x- и 3x-мерного изображения. Цель: изучить основные приёмы работы с изображением в аффинной системе координат. Теоретические сведения Аффинным называется такое изображения плоскости (пространства) в другой плоскости (пространстве), при котором каждая прямая отображается в прямую. Библиотека OpenGL содержит в себе функции и процедуры, для работы с аффинными преобразованиями. glTranslated(dx, dy, dz: Тип_переменных) – процедура переноса системы координат. Синтаксис “dx”, “dy”, “dz”: обозначения осей координат. Синтаксис Тип_переменных: обозначения типа координат (double, float, shortint, integer). glRotated (Angle, x, y, z: Тип_переменных) – процедура разворота системы координат. Синтаксис “x”, “y”, “z”: обозначения радиус-вектора. Синтаксис Angle: обозначения поворота. glScaled(kx, ky, kz: Тип_переменных) – процедура масштабирования. Синтаксис “kx”, “ky”, “kz”: обозначения коэффициента масштабирования. Задание 1 Вывести на экран изображение стрелки и проверить работу процедуру OpenGL. Задание 2 С применением OpenGL написать процедуру для вывода окружности с центром в начале координат и радиусом 1. Задание 3 Путём преобразований координат и вызова написанной процедуры вывести на экран несколько окружностей в разных позициях и с разным радиусом. Программаunit unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, OpenGL; type TGraphik = class(TForm) Painting: TPaintBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure The_FormPaint (Sender: TObject); private public hrc: HGLRC; end; |
||||||||||||
Лист |
||||||||||||
2 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
var Graphik: TGraphik; implementation {$R *.dfm} procedure SetDCPixelFormat(hdc: HDC); var pfd: TPixelFormatDescriptor; nPixelFormat: integer; begin FillChar (pfd, SizeOf(pfd), 0); nPixelFormat:=ChoosePixelFormat(hdc, @pfd); SetPixelFormat(hdc, nPixelFormat, @pfd); end; procedure TGraphik.FormCreate(Sender: TObject); begin SetDCPixelFormat(Canvas.Handle); hrc:=wglCreateContext(Canvas.Handle); end; procedure TGraphik.FormDestroy(Sender: TObject); begin wglDeleteContext(hrc); end; procedure TGraphik.The_FormPaint (Sender: TObject); Procedure Risovka_Kruga; var j:word; x:real; Begin glLineWidth(2); glEnable(GL_LINE_SMOOTH); glBegin(GL_LINE_STRIP); For j:=0to 359do Begin x:=j/180*Pi; glVertex2f(cos(x),sin(x)); End; glEnd; glDisable(GL_LINE_SMOOTH); glLineWidth(1); End; Begin wglMakeCurrent(Canvas.Handle, hrc); glClearColor(0.95, 0.95, 0.95, 1); glClear(GL_COLOR_BUFFER_BIT); glColor3d(1,1,1); glColor3d(0.1,0.1,0.1); glPushMatrix; Risovka_Kruga; glRotated(10,0,0,1); glTranslated(0.5, 0.5, 0); glScaled(0.1, 0.1, 1); Risovka_Kruga; glTranslated(-10, 0, 0); Risovka_Kruga; glTranslated(5, -1, 0); |
||||||||||||
Лист |
||||||||||||
3 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
glScaled(1, 3, 1); Risovka_Kruga; glTranslated(0, -3, 0); glScaled(5, 0.5, 1); Risovka_Kruga; glPopMatrix; wglMakeCurrent(0,0); End; End. Графическое изображение Задание 4 Переделать процедуру рисования графика с предыдущей лабораторной работы так, что по заданному интервалу изменения координаты х автоматически определялись необходимые границы выводу по y координате и на форму выведения всего графика функции в целом. ПрограммаProcedure TGraphik.The_FormPaint (Sender: TObject); Const E=200; var yMax,yMin,x,xMax,xMin,k,xPMax,xPMin,yPMax,yPMin,yP,xP:Real; j:integer; y:Array[0..E]Of Real; Begin xMax:=-10; xMin:=2.96; If xMax<xMin then Begin k:=xMin;xMin:=xMax;xMax:=k; End; k:=Xmax-xMin; |
||||||||||||
Лист |
||||||||||||
4 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
yMax:=0; yMin:=0; For j:=0to E do Begin x:=xMin+k*j/E; y(.j.):=2*sqr(sin(x))/(x-3); If y(.j.)>yMax then yMax:=y(.j.); If y(.j.)<yMin then yMin:=y(.j.); End; If xMax<-xMin*0.05then xPMax:=-xMin*0.05 else xPMax:=xMax; If xMin>-xMax*0.05then xPMin:=-xMax*0.05 else xPMin:=XMin; If yMax<-yMin*0.05then yPMax:=-yMin*0.05 else yPMax:=yMax; If yMin>-yMax*0.05then yPMin:=-yMax*0.05 else yPMin:=yMin; xP:=1/(xPMin/(xPMax+xPMin)-xPMax/(xPMax+xPMin)); yP:=1/(yPMin/(yPMax+yPMin)-yPMax/(yPMax+yPMin)); wglMakeCurrent(Canvas.Handle, hrc); glPushMatrix; glClearColor(0.2, 0.5, 0.75, 1.0); glClear(GL_COLOR_BUFFER_BIT); glColor3d(1,1,1); glTranslated(xP, yP, 0); glEnable(GL_LINE_STIPPLE); glLineStipple(1,$F00F); glBegin(GL_LINES); For j:=-9to 9do Begin glVertex2f(j*0.2, 2); glVertex2f(j*0.2, -2); glVertex2f(2, j*0.2); glVertex2f(-2, j*0.2); End; glEnd; glDisable(GL_LINE_STIPPLE); glBegin(GL_LINES); glColor3d(0,0,0); glVertex2f(2, 0); glVertex2f(-2, 0); glVertex2f(0, 2); glVertex2f(0, -2); glEnd; glBegin(GL_LINE_STRIP); glVertex2f(0.96-xP, 0.015); glVertex2f(1-xP, 0); glVertex2f(0.96-xP, -0.015); glEnd; glBegin(GL_LINE_STRIP); glVertex2f(0.015, 0.96-yP); glVertex2f(0, 1-yP); glVertex2f(-0.015, 0.96-yP); glEnd; glScaled(2/(xPMax-xPMin), 2/(yPMax-yPMin), 1); glColor3d(1,0,0); glLineWidth(2); glEnable(GL_LINE_SMOOTH); |
||||||||||||
Лист |
||||||||||||
5 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
glBegin(GL_LINE_STRIP); For j:=0to E do Begin glVertex2f(xMin+k*j/E, y(.j.)); End; glEnd; glDisable(GL_LINE_SMOOTH); glLineWidth(1); glPopMatrix; wglMakeCurrent(0,0); End; Графическоеизображение Вывод Я научился работать с аффинными преобразованиями в 2x-мерной графики на языке программирования “Delphi” с применением библиотеки OpenGL. При помощи сдвигов, поворотов, переносов, масштабирования я построил изображения нескольких окружностей в разных позициях и с разными радиусами, вызывая процедуры рисования окружности с R=1. Путём сдвига и масштабирования процедуры рисования графика функции y=F(x) я добился автоматического определения необходимых границ вывода графика функции в пределах окна. Т. о. график не зависит от изменения интервала функции. |
||||||||||||
Лист |
||||||||||||
6 |
||||||||||||
Зм. |
Лист |
№ Докум |
Підпис |
Дата |
||||||||
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.