You are on page 1of 11

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

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

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


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

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


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

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

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

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


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

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

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


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

ОСНОВИ КОМП‘ЮТЕРНОЇ ГРАФІКИ. РОБОТА В ДЕКАРТОВІЙ


СИСТЕМІ КООРДИНАТ.

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

ТЕОРЕТИЧНІ ОСНОВИ

1.1 Представлення точок

В даній лабораторній роботі будемо працювати в декартових координатах.


Точка задається за допомогою двох значень x y  , наприклад, 2 3 .

мал.1.1

1.2 Перетворення точок

Розглянемо результати матричного множення x y  , що визначає точку Р, і


матриці перетворення 2х2 загального виду:
x y   
a b
  ax  cy bx  dy    x * y *
c d 
Дослідимо декілька часткових випадків.

1) а=d=1 і c=b=0. Змін не відбувається


x y   
1 0
   x y    x * y * .
 0 1  y, y*
T= [a0 01 ]
2) d=1, b=c=0. Зміна масштабу по осі x P P*
x, x*
 a 0
x y      ax y    x * y * . мал.1.2
 0 1 
y, y*
P*

3) b=c=0. Зміна масштабу по осях x і y P T= [a0 0d ]


x y   
a 0
  ax dy    x * y *. мал.1.2 x, x*
0 d 
y, y*

4) b=c=0, d=1, a=-1. Відображення координат відносно осі


T= [ -10 10 ]
P* P
y
1 0 x, x*
x y       x y    x * y * .
 0 1
y, y*
5) b=c=0, a=d<0. Відображення відносно початку T= [-10 -10 ]
координат P
1 0 
x y       x  y    x * y * . x, x*
 0  1 
P*

y, y* y, y*
P* P P*
6) а=d=1, c=0. Зсув
x y   
1 b
   x bx  y    x * y * P T= [ 10 b1 ] T= [ 1c 10 ]
 0 1  x, x* x, x*
.

1.3 Перетворення прямих ліній (відрізків).

Будь-яка пряма будується за допомогою двох точок, наприклад, А і В.


Нехай точки А і В задані координатами - А 0, 1 і В 2, 3 .
Матриця ж перетворення, задана такими значеннями
1 2
T    .
 3 1 
В результаті декартового добутку вектора-точки на матрицю перетворення
одержимо:
1 2
AT  0, 1     3, 1  A * ,
3 1
1 2
BT  2, 3     11, 7   B * .
3 1
Тепер координати точок прямої мають вигляд такий А(3, 1) та В(11, 7).
Результат показано на мал.1.7.
y, y*
B*
B

A
T= [ 13 21 ]
A*
x, x*

мал. 1.7

1.4 Обертання

Розглянемо плоский трикутник ABC. Нехай координати трикутника задані


такими значеннями, А(3, 1), В(6, 1) та С(6, 4).

Матриця перетворення для повороту на 90° C* B*


y, y* T= [ -10 10]
 0 1 C
проти годинникової стрілки, виглядає так  
 1 0 A* A B
x, x*
Після декартового добутку одержимо матрицю:
3 1  1 3
   0 1  
 6 1        5 6  .
 6 4  1 0   4 6
   
В результаті отримаємо трикутник A*B*C*.

y, y* Матриця перетворення для повороту


c на 180° проти годинникової стрілки,
T= [-10 -10]  1 0 
A
виглядає так  
B 0  1
x, x*  
B* A* Після декартового добутку одержимо
матрицю:
C* 3 1 3 1 
   1 0   
 6 1        6 1  .
 6 4   0  1   6  4 
   
В результаті отримаємо трикутник
A*B*C*.
y, y*
Матриця перетворення для повороту на 270 проти
c
[01 -10 ]  0  1
T= годинникової стрілки, виглядає так:   .
A B  1 0 
x, x* Після декартового добутку одержимо
A* матрицю:
A*

B* C*
3 1  1  3
   0  1  
 6 1       1  6  .
 6 4 1 0   4  6
   
В результаті отримаємо трикутник А*B*C*.

y, y*
B* C*
1.5 Відображення.
C
T= [ 01 10]
Відображення визначається поворотом на 180° A* B
навколо осі, що лежить у площині х у. На простій A x, x*
мові це дзеркальне відображення трикутника. A*
1) Обертання навколо прямої y=x задається
0 1
матрицею:   .
1 0
Після декартового добутку одержимо матрицю:
3 1  1 3
  0 1  
 6 1       1 6  .
 6 4 1 0  4 6
   
В результаті отримаємо трикутник А*B*C*.

2) Обертання навколо осі y=0 задається


матрицею:
1 0 
  .
 0 1 
Після декартового добутку одержимо
матрицю:
8 1  8 1 
  1 0   
 7 3       7  3  .
 6 2   0  1  6  2 
   
В результаті отримаємо трикутник А*B*C*.
1.6 Зміна масштабу

Зміна масштабу визначається значенням 2-х елементів головної діагоналі


матриці. Якщо використовуємо матрицю
 2 0
  маємо збільшення в 2 рази. Якщо
 0 2
значення елементів не рівні, то має місце
спотворення.

Нехай трикутник заданий координатами


А(1, 1), В(3, 1) та С(1, 3). Тепер збільшимо
трикутник в 3 рази.
1 1  3 3
   3 0  
 3 1       9 3 
 1 3  0 3   3 9 
   
В результаті отримаємо трикутник А*B*C*.

1.7 Двовимірний зсув і однорідні координати.

Введемо третій компонент у вектори точок x, y  і  x * y *-  x y 1 і


x * y * 1 .
Матриця перетворення матиме вигляд:
 1 0
 
 0 1.
m n
 
Таким чином,
 1 0
 
x y 1   0 1   x  m y  n   x * y * .
m n
 

Константи m, n викликають зсув x* і y*


відносно x і y.
Матриця 3х2 не квадратна - вона не має
оберненої матриці.
Доповнимо матрицю перетворення до квадратної
 1 0 0
 
 0 1 0 .
 m n 1
 
Третій компонент не змінюється.
ПОРЯДОК РОБОТИ
1. Побудувати декартову систему координат.
2. Виведіть на панель можливість задання координат точок та матриці
перетворення.
3. Здійсніть масштабування однієї поділки по осях OX та OY.
4. Побудуйте точку у декартовій системі координат. Здійсніть усі
перетворення точок за допомогою матричних перетворень.
5. Побудуйте відрізок. Виведіть на панель можливість введення координат
відрізка та матриці перетворення. Здійсніть перетворення відрізків.
6. Побудуйте трикутник. Здійсніть перетворення трикутника: обертання,
відображення, масштабування, зсув.

ЗМІСТ ЗВІТУ
Звіт повинен містити:
1) назву роботи;
2) мету роботи;
3) короткий теоретичний вступ;
4) завдання до лабораторної роботи;
5) тексти розроблених і відлагоджених програм;
6) рисунки з реалізацією програми;
7) висновки.
Приклад програми реалізації
unit Unit1; end;
interface
uses procedure T;
Windows, SysUtils, Classes, Graphics, Controls, begin
Forms, StdCtrls, ExtCtrls; with form1.p do
type begin
TForm1 = class(TForm) canvas.moveto((Width div 2)+(v[1]*dx),(Height div
E1: TEdit; 2)-(v[2]*dx));
E2: TEdit; canvas.lineto((Width div 2)+(v[3]*dx),(Height div
e7: TEdit; 2)-(v[4]*dx));
e8: TEdit; canvas.MoveTo((Width div 2)+(v[3]*dx),(Height div
e9: TEdit; 2)-(v[4]*dx));
Label4: TLabel; canvas.LineTo((Width div 2)+(v[5]*dx),(Height div
Button1: TButton; 2)-(v[6]*dx));
Button2: TButton; canvas.MoveTo((Width div 2)+(v[5]*dx),(Height div
Button3: TButton; 2)-(v[6]*dx));
Button4: TButton; canvas.LineTo((Width div 2)+(v[1]*dx),(Height div
Button5: TButton; 2)-(v[2]*dx));
e10: TEdit; end;
Button6: TButton; end;
Button7: TButton;
Button8: TButton; procedure TForm1.Button1Click(Sender: TObject);
E3: TEdit; begin
e4: TEdit; getparam;
E5: TEdit; p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
E6: TEdit; p.Canvas.Pen.Color:=cllime;
P: TPaintBox; p.Canvas.MoveTo((p.Width div 2)+(v[1]*dx),
Label1: TLabel; (p.Height div 2)-(v[2]*dx));
Button9: TButton; p.Canvas.LineTo((p.Width div 2)+(v[1]*dx),
procedure Button1Click(Sender: TObject); (p.Height div 2)-(v[2]*dx));
procedure Button2Click(Sender: TObject); p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
procedure Button3Click(Sender: TObject); end;
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject); procedure TForm1.Button2Click(Sender: TObject);
procedure Button6Click(Sender: TObject); begin
procedure Button7Click(Sender: TObject); getparam;
procedure PPaint(Sender: TObject); p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
procedure Button8Click(Sender: TObject); p.Canvas.Pen.Color:=cLYELLOW;
procedure FormCreate(Sender: TObject); p.Canvas.Moveto((p.Width div 2)+(v[1]*dx)*v[7]
procedure Button9Click(Sender: TObject); ,(p.Height div 2)-(v[2]*dx));
private p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*v[7]
{ Private declarations } ,(p.Height div 2)-(v[2]*dx));
public p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
{ Public declarations } end;
end;
var procedure TForm1.Button3Click(Sender: TObject);
Form1: TForm1; begin
y2,x2,x,y,i,j,k,kk,Dx:integer; getparam;
v:array[1..10] of integer; p.Canvas.Pen.Color:=cLgreen;
error:boolean=false; p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
implementation p.Canvas.moveto((p.Width div 2)+(v[1]*dx)*v[7]
{$R *.DFM} ,(p.Height div 2)-(v[2]*dx)*v[10]);
procedure getparam; p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*v[7]
begin ,(p.Height div 2)-(v[2]*dx)*v[10]);
with form1 do p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
for i := 1 to 10 do end;
if TEdit(FindComponent('E' +
IntToStr(i))).Text <>'' then procedure TForm1.Button4Click(Sender: TObject);
v[i]:=StrToInt(TEdit(FindComponent('E' + begin
IntToStr(i))).Text) else error:=true; getparam;
p.Canvas.Pen.Color:=cLwhite; if w<>0 then
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10; textout((p.width div 2)+5,i-7,IntToStr(w));
p.Canvas.moveto((p.Width div 2)+(v[1]*dx)*-1 i:=i+dx;
,(p.Height div 2)-(v[2]*dx)); dec(w);
p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*-1 end;
,(p.Height div 2)-(v[2]*dx)); end;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10; end;
end;
procedure TForm1.Button7Click(Sender: TObject);
procedure TForm1.Button5Click(Sender: TObject); var k,kk:integer;
begin begin
getparam; getparam;
p.Canvas.Pen.Color:=cLAqua; x:=(p.Width div 2)+(v[1]*dx);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10; y:=(p.Height div 2)-(v[2]*dx);
p.Canvas.moveto((p.Width div 2)+(v[1]*dx)*-1 ppaint(form1);
,(p.Height div 2)-(v[2]*dx)*-1); x2:=(p.Width div 2)+(v[3]*dx);
p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*-1 y2:=(p.Height div 2)-(v[4]*dx);
,(p.Height div 2)-(v[2]*dx)*-1); p.Canvas.MoveTo(x,y);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10; p.Canvas.LineTo(x2,y2);
end; k:=((v[7]*v[1])+(v[9]*v[2]));
kk:=((v[8]*v[1])+(v[10]*v[2]));
procedure TForm1.Button6Click(Sender: TObject); x:=(p.Width div 2)+(k*dx);
begin y:=(p.Height div 2)-(kk*dx);
getparam;
p.Canvas.Pen.Color:=cLred; k:=((v[7]*v[3])+(v[9]*v[4]));
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10; kk:=((v[8]*v[3])+(v[10]*v[4]));
k:=(p.Height div 2)-((v[1]*v[8]+v[2])*dx); x2:=(k*dx)+(p.Width div 2);
p.Canvas. moveto((p.Width div 2)+(v[1]*dx),k); y2:=(p.Height div 2)-(kk*dx);
p.Canvas. Lineto((p.Width div 2)+(v[1]*dx),k);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10; p.Canvas.MoveTo(x,y);
end; p.Canvas.LineTo(x2,y2);
end;
procedure TForm1.PPaint(Sender: TObject);
var w:integer; procedure TForm1.Button8Click(Sender: TObject);
begin var vv:array[0..10] of integer;
i:=1; begin
w:=-10; getparam;
with p.Canvas do ppaint(form1);
begin t;
p.Canvas.FillRect(rect(0,0,p.width,p.height)); // for xy=z & y=0
pen.Color:=clwhite; for i:=1 to 10 do
moveto(p.Width div 2,0); vv[i]:=v[i];
lineto(p.Width div 2,p.Height-0); vv[1]:=v[1]*v[7]+v[2]*v[9];
moveto(0,p.Height div 2); vv[2]:=v[1]*v[8]+v[2]*v[10];
lineto(p.Width-0,p.Height div 2); vv[3]:=v[3]*v[7]+v[4]*v[9];
dX:=p.Width div 20; vv[4]:=V[3]*v[8]+v[4]*v[10];
font.Color:=cllime; vv[5]:=v[5]*v[7]+v[6]*v[9];
while i<p.Width do vv[6]:=v[5]*v[8]+v[6]*v[10];
begin for i:=1 to 10 do
moveto(i,(p.Height div 2)); v[i]:=vv[i];
lineto(i,(p.height div 2)+5); t;
if w<>0 then end;
textout(i-4,(p.height div 2)+6,
IntToStr(w)); procedure TForm1.FormCreate(Sender: TObject);
i:=i+dX; begin
inc(w); label4.Caption:='a : b: '+
end; #10+#13+#10+#13+#10+#13+'c : d :';
i:=1; label1.Caption:='X1 X2
w:=10; X3'+#10+#13
while i<p.Height do +#10+#13+'Y1 Y2
begin Y3';
moveto((p.width div 2),i); end;
lineto((p.width div 2)+5,i);
procedure TForm1.Button9Click(Sender: TObject);
var vv:array[0..10] of integer;
begin
getparam;
ppaint(form1);
t;
// a=n;b=m;
for i:=1 to 10 do
vv[i]:=v[i];
vv[1]:=v[1]+v[8];
vv[2]:=v[2]+v[7];
vv[3]:=v[3]+v[8];
vv[4]:=V[4]+v[7];
vv[5]:=v[5]+v[8];
vv[6]:=v[6]+v[7];
for i:=1 to 10 do
v[i]:=vv[i];
t;
end;
end.

You might also like