You are on page 1of 16

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

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
"ЛЬВІВСЬКА ПОЛІТЕХНІКА”

МЕТОДИЧНІ ВКАЗІВКИ ДО ЛАБОРАТОРНОЇ РОБОТИ № 2


з курсу "Компютерна графіка"

Для студентів бакалаврського рівня


підготовки по спеціальності
«Видавничо-поліграфічна справа»

Затверджено на засіданні
кафедри АСУ. Протокол № 3
від 10.05.2004.

Львів – 2010
Робота в просторовій системі координат: Методичні вказівки до
лабораторної роботи № 2 з курсу "Комп’ютерна графіка" для студентів
спеціальності «Видавничо-поліграфічна справа» / Укл.: О.Я. Різник, М.А.
Назаркевич, Д. Скрибайло-Леськів - Львів: Видавництво Національного університету
"Львівська політехніка", 2004. - 12 с.

Укладач О.Я. Різник,


М.А. Назаркевич,
Д. Скрибайло-Леськів

Відповідальний за випуск Шпак З.Я., канд. техн. наук, доц.

Рецензент Вальковський В.А., д-р техн. наук, проф.


Лабораторна робота №2

Основи комп‘ютерної графіки. Робота в просторовій системі координат.

Мета: Ознайомлення з основами комп‘ютерної графіки в просторовій системі


координат.
ТЕОРЕТИЧНІ ОСНОВИ

2.1 Вступ

Для кращого сприйняття форми об'єкта необхідно мати його зображення в


тривимірному просторі. У багатьох випадках наочне представлення про об'єкт
можна одержати шляхом виконання операцій обертання і переносу, а також
побудови проекцій. Введемо однорідні координати. Точка в тривимірному
просторі  x y z  задається чотиримірним вектором  x y z 1 або ж
 X Y Z H  . Перетворення з однорідних координат описується
співвідношеннями
 X Y Z H   x y z 1  T
x * y * z * 1   X / H Y / H Z / H 1
де T - деяка матриця перетворення.
 a b c p
 
d e f g 
T 
h i j r
 
 l m n s 
Ця матриця може бути представлена у вигляді 4 окремих частин
 3  3 3  1
 
 1 3 1 1 
Матриця 3x3 здійснює лінійне перетворення у виді зміни масштабу, зсуву
й обертання. Матриця-рядок 1х3 робить перенос, а матриця-стовпець 3х1 -
перетворення в перспективі. Останній скалярний елемент виконує загальну
зміну масштабу. Повне перетворення, отримане шляхом впливу на вектор
положення матрицею 4x4 і нормалізації перетвореного вектора, будемо
називати білінійним перетворенням. Воно забезпечує виконання комплексу
операцій зсуву, часткової зміни масштабу, обертання, відображення, переносу,
а також зміни масштабу зображення в цілому.
2.2 Тривимірна зміна масштабу

Діагональні елементи основної матриці перетворення 4х4 здійснюють


часткову і повну зміну масштабу. Розглянемо перетворення
a 0 0 0
 
 0 e 0 0
 x y z 1    ax ey jz 1   x * y * z * 1 ,
0 0 j 0
 
 0 0 0 1 
яке робить часткову зміну масштабу. На мал.2.1 показане масштабне
збільшення кубу в три рази. Загальна зміна масштабу:
s 0 0 0
 
0 s 0 0
x y z 1   s * x s* y s*z s .
0 0 s 0
 
0 0 0 s 

мал. 2.1
Зменшення масштабу можна досагнути при рівних коефіцієнтах
часткових змін масштабів. Зменшення масштабу представлене на мал. 2.2. У
цьому випадку матриця перетворення повинна бути рівна
 1 
 0 0 0 
 s 
 0 1
0 0 
 s  .
 1 
 0 0 0 
 s 
 0 0 0 1 

мал. 2.2

2.3 Перетворення трьохвимірні координати в двовимірні


Нехай в трьохвимірному середовищі точка задана координатами (x,y,z). При переході у
двовимірне середовище маємо
x=x-z*sin(  )
y=y-z*sin(  ), де  - це кут між осями x та z .
2.4 Тривимірний зсув

Недіагональні елементи верхньої лівої під матриці 3х3 від загальної матриці
перетворення розміру 4х4 здійснюють зсуви в трьох вимірах, тобто
1 b c 0
 
d 1 f 0
x y z 1   
h i 1 0 .
 
0 0 0 1
  x  dy  hz bx  y  iz cx  fy  z 1 .
Нехай матриця перетворення має такий вигляд:
2 1 0 0
 
1 2 1 0
 .
1 2 2 0
 
0 0 0 2 

мал. 2.3

2.5 Тривимірні обертання

Раніше було показано, що матриця 3х3 забезпечувала комбінацію


операцій зміни масштабу і зсуву. Однак, якщо визначник матриці 3х3 дорівнює
+1, то має місце чисте обертання навколо початку координат. Перед розглядом
загального випадку тривимірного обертання навколо довільної осі дослідимо
кілька окремих випадків. При обертанні навколо осі х розміри уздовж осі х не
змінюються. Таким чином, матриця перетворень буде мати нулі в першому
рядку і першому стовпці, за винятком одиниці на головній діагоналі. Це
приводить до матриці перетворення, що відповідає повороту на кут  навколо
осі х і задається співвідношенням
1 0 0 0
 
 0 cos  sin  0 
T  .
0  sin  cos  0 
 
 0 0 0 1 
Обертання вважається додатнім, тобто за годинниковою стрілкою, якщо
дивитися з початку координат вздовж осі обертання. На мал.2.4 показаний
поворот на 45° навколо осі x.
мал. 2.4

Для обертання на кут Ф навколо осі y - нулі ставлять у другому рядку і


другому стовпці матриці перетворення, за винятком одиниці на головній
діагоналі. Повна матриця задається виразом
 cos  0  sin  0 
 
 0 1 0 0
T  .
sin  0 cos  0 
 
 0 0 0 1 

Приклад обертання навколо осі у на мал. 2.5

мал. 2.5

Аналогічно матриця перетворення для обертання на кут  навколо осі z


має вид
 cos  sin  0 0 
 
  sin  cos  0 0 
T  .
0 0 1 0
 
 0 0 0 1 
Приклад обертання навколо осі у на мал. 2.6

мал. 2.6

Аналіз визначників для матриць (4.6)-(4.8) показує, що для будь-якої


матриці обертання детермінант дорівнює +1.
Тому що обертання описуються множенням матриць, то тривимірні
обертання некомутативні, тобто порядок множення буде впливати на кінцевий
результат. Для того щоб показати це, розглянемо обертання навколо осі х, за
яким слідує обертання на такий же кут навколо осі y. Використовуючи рівняння
(4.6) і (4.7) при  = Ф, одержимо

1 0 0 0   cos  0  sin  0
   
 0 cos  sin  0  0 1 0 0
T   
0  sin  cos  0   sin  0 cos  0
   
0 0 0 1   0 0 0 1 
 cos  0  sin  0
 
 sin 2
 cos  cos  sin  0 
 .
cos  sin   sin  cos 
2
0
 
 0 0 0 1 
Зворотна послідовність дій, тобто обертання навколо осі y і наступне за
ним обертання на такий же кут навколо осі x при  = Ф дає
 cos  0  sin  0   1 0 0 0
   
 0 1 0 0   0 cos  sin  0
T   
sin  0 cos  0   0  sin  cos  0
   
 0 0 0 1  0 0 0 1 
 cos  sin 2   sin  cos  0 
 
 0 cos  sin  0
 .
sin   sin  cos  cos 2  0
 
 0 0 0 1 
 

2.6 Відображення в просторі

Іноді потрібно виконати дзеркальне відображення тривимірного


зображення. У трьох вимірах найпростіше відображення здійснюється щодо
площини. Для відображення без зміни масштабів необхідно, щоб визначник
перетворення дорівнював -1,0. При відображенні щодо площини xy змінюється
тільки знак координати z. Отже, матриця перетворення для відображення щодо
площини xy має вигляд
1 0 0 0
 
 0 1 0 0 
T  .
0 0 1 0
 
0 0 0 1
Відображення одиничного куба щодо площини ху показане на мал.2.7.
Для відображення щодо площини уz
1 0 0 0
 
 0 1 0 0 
T 
0 0 1 0
 
 0 0 0 1 
мал. 2.7
а для відображення щодо площини xz
1 0 0 0
 
0 1 0 0
T 
0 0 1 0
 
0 0 0 1 

мал. 2.8
Відображення щодо інших площин можна одержати шляхом комбінації
обертання і відображення.
2.7 Просторовий перенос

Тривимірний лінійний перенос зображення задається виразом


 X Y Z H   x  l y  m z  n 1 
Після перемножування одержимо
X
x*   x  l;
H
Y
y*   y  m;
H
Z
z*   z  n.
H
приклад, просторового переносу (l=2;m=-2;n=0)

мал. 2.9
2.8 Тривимірне обертання навколо довільної осі

Метод двовимірного плоского обертання навколо довільної осі був


розглянений раніше. Узагальненням цього методу є спосіб обертання навколо
довільної осі в тривимірному просторі. Як і для плоского випадку, розглянена
процедура полягає в переносі зображення і заданої осі обертання, що
забезпечує обертання навколо осі, що проходить через початок координат.
Метод тривимірного обертання полягає в лінійному переносі, обертанні
навколо початку координат і зворотньому лінійному переносі у вихідне
положення. Якщо вісь, навколо якої виконується обертання, проходить через
точку А = 1 m n 1 , то матриця перетворення визначається наступним
виразом:
X Y Z H   x y z 1
 1 0 0 0 1 0 0 0
   
 0 1 0 0   0 1 0 0 
  R
0 0 1 0 0 0 1 0
   
 l  m  n 1  l m n 1
де елементи матриці обертання R розміру 4х4 визначаються в загальному
випадку співвідношенням
 n12  1  n12  cos  n1n2 1  cos    n3 sin 

 n1 n2 1  cos    n3 sin  n22  1  n22  cos 
R 
n1n3 1  cos    n2 sin  n2 n3 1  cos    n1 sin 

 0 0

n1 n 3 1  cos    n 2 sin  0

n n 1  cos    n1 sin  0
 2 32
n 3  (1  n 32 ) cos  0

0 1 
Результат добутку матриць:

мал. 2.10
ЗМІСТ ЗВІТУ
Звіт повинен містити:
1) назву роботи;
2) мету роботи;
3) короткий теоретичний вступ;
4) завдання до лабораторної роботи;
5) тексти розроблених і відлагоджених програм
6) малюнки з реалізацією програми
7) висновки

Приклад реалізації програми


procedure Button1Click(Sender: IntToStr(i)+'_'+IntToStr(j))).Text
unit Unit1; TObject); <>'' then
procedure Button2Click(Sender:
interface TObject); matrix[i,j]:=StrTofloat(TEdit(FindCompo
procedure Button3Click(Sender: nent('E' +
uses TObject);
Windows, Messages, SysUtils, Classes, private IntToStr(i)+'_'+IntToStr(j))).Text);
Graphics, Controls, Forms, Dialogs, { Private declarations } end;
StdCtrls, ExtCtrls,math; public
{ Public declarations } procedure Draw; //x=x-
const end; z*sin(alpha)
qw=2; begin //y=y-z*sin(alpha)
fon=clPurple; var with form1.p.Canvas do //alpha=30
Form1: TForm1; begin
type z,y2,x2,x,y,i,j,k,kk,x_temp:integer; pen.Width:=pen.Width+2;
b=array[1..8,1..4] of Extended; box:b; MoveTo(x_(box[1,1]-
m=array[1..4,1..4] of Extended; matrix:m; box[1,3]/2),y_(box[1,2]-box[1,3]/2));//000
TForm1 = class(TForm) cikl:boolean=false; pen.Color:=cllime;
E1_1: TEdit; implementation lineto(x_(box[2,1]-
e1_2: TEdit; box[2,3]/2),Y_(box[2,2]-
Label1: TLabel; {$R *.DFM} box[2,3]/2));//001
e2_3: TEdit; procedure mat(var p:b;pp:m); lineto(x_(box[6,1]-
e2_4: TEdit; var temp:array[1..8,1..4]of real; box[6,3]/2),Y_(box[6,2]-
e3_1: TEdit; begin box[6,3]/2));//101
Button1: TButton; for i:=1 to 8 do lineto(x_(box[5,1]-
P: TPaintBox; for j:=1 to 4 do box[5,3]/2),Y_(box[5,2]-
Button2: TButton; temp[i,j]:=0 ; box[5,3]/2));//100
e3_2: TEdit; for i:=1 to 8 do lineto(x_(box[1,1]-
e1_3: TEdit; for j:=1 to 4 do box[1,3]/2),Y_(box[1,2]-
e1_4: TEdit; for z:=1 to 4 do box[1,3]/2));//000
e2_1: TEdit; temp[i,j]:=temp[i,j]+(p[i,z]*pp[j,z]);
E2_2: TEdit; for i:=1 to 8 do moveto(x_(box[3,1]-
e3_3: TEdit; for j:=1 to 4 do box[3,3]/2),Y_(box[3,2]-
e3_4: TEdit; p[i,j]:=temp[i,j]; box[3,3]/2));//010
e4_1: TEdit; end; lineto(x_(box[4,1]-
e4_2: TEdit; box[4,3]/2),Y_(box[4,2]-
e4_3: TEdit; function X_ (a:real):integer; box[4,3]/2));//011
e4_4: TEdit; begin lineto(x_(box[8,1]-
C: TCheckBox; result:=round((form1.P.Width div box[8,3]/2),Y_(box[8,2]-
Button3: TButton; 2)+(a*x_temp)); box[8,3]/2));//111
Grad: TEdit; end; lineto(x_(box[7,1]-
Panel1: TPanel; function y_ (a:real):integer; box[7,3]/2),Y_(box[7,2]-
r1: TRadioButton; begin box[7,3]/2));//110
r2: TRadioButton; result:=round((form1.P.height div 2)- lineto(x_(box[3,1]-
r3: TRadioButton; a*(x_temp )); box[3,3]/2),Y_(box[3,2]-
r4: TRadioButton; end; box[3,3]/2));//010
Label2: TLabel;
Edit1: TEdit; procedure getparam; moveto(x_(box[4,1]-
Edit2: TEdit; begin box[4,3]/2),Y_(box[4,2]-
Edit3: TEdit; with form1 do box[4,3]/2));//011
Label3: TLabel; for i:=1 to 4 do lineto(x_(box[2,1]-
procedure PPaint(Sender: TObject); for j:=1 to 4 do box[2,3]/2),Y_(box[2,2]-
procedure FormCreate(Sender: if TEdit(FindComponent('E' + box[2,3]/2));//001
TObject); moveto(x_(box[8,1]-
box[8,3]/2),Y_(box[8,2]- case j of matrix[3,1]:=-matrix[1,3];
box[8,3]/2));//111 4:box[i,j]:=qw; matrix[3,3]:=matrix[1,1];
lineto(x_(box[6,1]- 1: if i<=4 then box[i,j]:=0 else end;
box[6,3]/2),Y_(box[6,2]- box[i,j]:=qw; if r3.Checked then
box[6,3]/2));//101 3: if (i mod 2)=0 then box[i,j]:=qw else begin
moveto(x_(box[7,1]- box[i,j]:=0; matrix[3,3]:=1;
box[7,3]/2),Y_(box[7,2]- 2: begin matrix[4,4]:=1;
box[7,3]/2));//110 if t>2 then
lineto(x_(box[5,1]- begin matrix[1,1]:=cos(DegToRad(StrToFloat(g
box[5,3]/2),Y_(box[5,2]- t:=1; rad.text)));
box[5,3]/2));//100 tt:=tt*-1;
moveto(x_(box[3,1]- end; matrix[1,2]:=sin(DegToRad(StrToFloat(gr
box[3,3]/2),Y_(box[3,2]- if tt=1 then box[i,j]:=0 else ad.text)));
box[3,3]/2));//010 box[i,j]:=qw; matrix[2,1]:=-matrix[1,2];
lineto(x_(box[1,1]- inc(t); matrix[2,2]:=matrix[1,1];
box[1,3]/2),Y_(box[1,2]- end; end;
box[1,3]/2));//000 end; if r4.Checked then
pen.Color:=fon; button1.Caption:='Ïîáóäîâà îäèíè÷íîãî begin
pen.Width:=pen.Width-2; êóáà'; getparam;
end; button1.Caption:='Îïåðàö³¿ íàä êóáîì';
end; button1.Caption:='Ïîâîðîò'; matrix_[1,4]:=cos(DegToRad(StrToFloat(
label3.Caption:=' N1 N2 N3'; Edit1.Text)));
procedure TForm1.PPaint(Sender: label2.Caption:='ÊÓÒ :';
TObject); R1.Caption:='Ïî X'; matrix_[2,4]:=cos(DegToRad(StrToFloat(
begin r2.Caption:='Ïî Y'; Edit2.Text)));
with p.Canvas do r3.Caption:='Ïî Z';
begin r4.Caption:='Ïî óÿâí³é (XYZ)'; matrix_[3,4]:=cos(DegToRad(StrToFloat(
c.Caption:='ÏÅÐÅÌÀËÜÎÂÊÀ'; Edit3.Text)));
p.Canvas.FillRect(rect(0,0,p.width,p.heigh
t)); end; matrix_[1,1]:=sqr(StrToFloat(Edit1.Text))
pen.Color:=clwhite; +(1-
moveto(p.Width div 2,0); procedure TForm1.Button1Click(Sender: sqr(StrToFloat(Edit1.Text)))*cos(DegToR
lineto(p.Width div 2,(p.Height div TObject); ad(StrToFloat(grad.text)));
2)); begin
moveto(p.Width div 2,p.Height div formcreate(form1); matrix_[1,2]:=StrToFloat(Edit2.Text)*Str
2); if c.Checked then ppaint(form1); ToFloat(Edit1.Text)*(1-
lineto(p.Width ,p.Height div 2); draw; cos(DegToRad(StrToFloat(grad.text))))-
moveto(p.Width div 2,p.Height div end; (StrToFloat(Edit3.Text)*sin(DegToRad(S
2); trToFloat(grad.text))));
lineto(70,p.Height-70); procedure TForm1.Button2Click(Sender:
i:=(p.width div 2)+x_temp; TObject); matrix_[1,3]:=StrToFloat(Edit3.Text)*Str
while i<p.Width do begin ToFloat(Edit1.Text)*(1-
begin formcreate(form1); cos(DegToRad(StrToFloat(grad.text))))+(
moveto(i,(p.Height div 2)-10); getparam; StrToFloat(Edit2.Text)*sin(DegToRad(St
lineto(i,(p.height div 2)+10); if c.Checked then ppaint(form1); rToFloat(grad.text))));
i:=i+x_temp ; mat(box,matrix); matrix_[1,4]:=0;
end; draw;
i:=0; end; matrix_[2,1]:=StrToFloat(Edit2.Text)*Str
while i<(p.Height div 2)-x_temp do ToFloat(Edit1.Text)*(1-
begin procedure TForm1.Button3Click(Sender: cos(DegToRad(StrToFloat(grad.text))))+(
moveto((p.width div 2)-10,i); TObject); StrToFloat(Edit3.Text)*sin(DegToRad(St
lineto((p.width div 2)+10,i); var matrix_:m; rToFloat(grad.text))));
i:=i+x_temp; begin
end; if c.Checked then ppaint(form1); matrix_[2,2]:=sqr(StrToFloat(Edit2.Text))
i:=52+x_temp; for i:=1 to 4 do +(1-
j:=p.Height-i; for j:=1 to 4 do sqr(StrToFloat(Edit2.Text)))*cos(DegToR
while i<(p.Width div 2) do matrix[i,j]:=0 ; ad(StrToFloat(grad.text)));
begin if r1.Checked then
moveto(i-14,j); begin matrix_[2,3]:=StrToFloat(Edit2.Text)*Str
lineto(i+1,j+10); matrix[1,1]:=1; ToFloat(Edit3.Text)*(1-
i:=i+x_temp div 2; matrix[4,4]:=1; cos(DegToRad(StrToFloat(grad.text))))-
j:=j-x_temp div 2; (StrToFloat(Edit1.Text)*sin(DegToRad(S
end; matrix[2,2]:=cos(DegToRad(StrTofloat(gr trToFloat(grad.text))));
end; ad.text))); matrix_[2,4]:=0;
end;
matrix[2,3]:=SIN(DegToRad(StrTofloat(g matrix_[3,1]:=StrToFloat(Edit3.Text)*Str
procedure TForm1.FormCreate(Sender: rad.text))); ToFloat(Edit1.Text)*(1-
TObject); matrix[3,2]:=-matrix[2,3]; cos(DegToRad(StrToFloat(grad.text))))-
var t,tt:integer; matrix[3,3]:=matrix[2,2]; (StrToFloat(Edit2.Text)*sin(DegToRad(S
begin end; trToFloat(grad.text))));
x_temp:=p.Width div 20; if r2.Checked then
t:=1; begin matrix_[3,2]:=StrToFloat(Edit2.Text)*Str
tt:=1; matrix[2,2]:=1; ToFloat(Edit3.Text)*(1-
label1.Caption:='y\x 1 2 3 4'+ matrix[4,4]:=1; cos(DegToRad(StrToFloat(grad.text))))+(
#10+#13+'1'+#10+#13+'2'+#10+#13+'3'+ StrToFloat(Edit1.Text)*sin(DegToRad(St
#10+#13+'4'; matrix[1,1]:=cos(DegToRad(StrToFloat(g rToFloat(grad.text))));
// kub 1x1x1 rad.text)));
for j:=1 to 4 do matrix[1,3]:=- matrix_[3,3]:=sqr(StrToFloat(Edit3.Text))
for i:=1 to 8 do sin(DegToRad(StrToFloat(grad.text))); +(1-
sqr(StrToFloat(Edit3.Text)))*cos(DegToR
ad(StrToFloat(grad.text)));
matrix_[3,4]:=0;
matrix_[4,1]:=0;
matrix_[4,2]:=0;
matrix_[4,3]:=0;
matrix_[4,4]:=1;
mat(box,matrix_);
end;
for i:=1 to 4 do
for j:=1 to 4 do
if (r1.Checked) and (r2.Checked)
and(r3.Checked) then
matrix[i,j]:=matrix[i,j]/3*2.07 ;
if not r4.Checked then
mat(box,matrix);
draw;
end;
end.

You might also like