- •Комп’ютерна графіка
- •1.3 Перетворення прямих ліній (відрізків)
- •1.4 Обертання
- •1.5 Відображення
- •1.6 Зміна масштабу
- •1.7 Двовимірний зсув і однорідні координати
- •2.6 Відображення в просторі
- •2.2 Тривимірна зміна масштабу
- •2.3 Перетворення трьохвимірних координат в двовимірні
- •2.4 Тривимірний зсув
- •2.7 Просторовий перенос
- •2.8 Тривимірне обертання навколо довільної осі
- •3.2 Косокутні проекції
- •Лабораторна робота №4 Алгоритм креслення відрізків
- •Теоретичні основи
- •Лабораторна робота № 5 Метод цифрового диференціального аналізатора
- •Теоретичні відомості
- •Алгоритм Брезенхема розкладання в растр відрізка для першого октанта
- •6.2. Загальний алгоритм Брезенхема.
- •Узагальнений цілочисельний алгоритм Брезенхема для усіх квадрантів
- •Лабораторна робота № 7 Алгоритм Брезенхема для генерації кола
- •Теоретичні основи
- •8.2 . Простий алгоритм з упорядкованим списком ребер
- •Простий алгоритм з упорядкованим списком ребер
- •8.3. Більш ефективні алгоритми з упорядкованим списком ребер
- •Більш ефективний алгоритм з упорядкованим списком ребер
- •9.1 Простий алгоритм заповнення з запалом і стеком
- •9.2 Простий алгоритм заповнення
- •Приклад 9.1. Простий алгоритм заповнення з запалом
- •Приклад 9.2. Алгоритм заповнення з запалом для багатокутника з діркою
- •9.3 Порядковий алгоритм заповнення з запалом
- •9.4 Алгоритм порядкового заповнення з запалом
- •9.5 Порядковий алгоритм заповнення з запалом
- •Приклад 9.3. Порядковий алгоритм заповнення з запалом
- •Література
- •Комп’ютерна графіка Методичні вказівки
1.5 Відображення
Відображення визначається поворотом на 180° навколо осі, що лежить у площині х у. На простій мові це дзеркальне відображення трикутника.
1) Обертання навколо прямої y=x задається матрицею:
.
Після декартового добутку одержимо матрицю:
.
В результаті отримаємо трикутник А*B*C*.
2
)
Обертання навколо осі y=0
задається матрицею:
.
Після декартового добутку одержимо матрицю:
.
В результаті отримаємо трикутник А*B*C*.
1.6 Зміна масштабу
Зміна масштабу визначається значенням 2-х елементів головної діагоналі матриці. Якщо використовуємо матрицю
,
т
о
маємо збільшення в 2 рази. Якщо
значення елементів не рівні, то має місце
спотворення.
Нехай трикутник заданий
координатами А(1, 1), В(3, 1) та С(1, 3).
Тепер збільшимо трикутник в 3 рази.
В результаті отримаємо трикутник А*B*C*.
1.7 Двовимірний зсув і однорідні координати
Введемо третій компонент у вектори точок (x, y) і (x* y*) -
(x y 1) і (x* y* 1).
Матриця перетворення матиме вигляд:
.
Таким чином,
.
Константи m, n викликають зсув x* і y*
відносно x і y.
Матриця 3х2 не квадратна - вона не має
оберненої матриці.
Доповнимо матрицю перетворення до
квадратної
.
Третій компонент не змінюється.
ПОРЯДОК ВИКОНАННЯ РОБОТИ
1. Побудуйте декартову систему координат.
2. Виведіть на панель можливість задання координат точок та матриці перетворення.
3. Здійсніть масштабування однієї поділки по осях OX та OY.
4. Побудуйте точку у декартовій системі координат. Здійсніть усі перетворення точок за допомогою матричних перетворень.
5. Побудуйте відрізок. Виведіть на панель можливість введення координат відрізка та матриці перетворення. Здійсніть перетворення відрізків.
6. Побудуйте трикутник. Здійсніть перетворення трикутника: обертання, відображення, масштабування, зсув.
ВИМОГИ ДО ЗВІТУ
Звіт повинен містити:
1) назву роботи;
2) мету роботи;
3) короткий теоретичний вступ;
4) завдання до лабораторної роботи;
5) тексти розроблених і відлагоджених програм;
6) рисунки з реалізацією програми;
7) висновки.
ПРИКЛАД ПРОГРАМНОЇ РЕАЛІЗАЦІЇ
unit Unit1;
interface
uses
Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
E1: TEdit;
E2: TEdit;
e7: TEdit;
e8: TEdit;
e9: TEdit;
Label4: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
e10: TEdit;
Button6: TButton;
Button7: TButton;
Button8: TButton;
E3: TEdit;
e4: TEdit;
E5: TEdit;
E6: TEdit;
P: TPaintBox;
Label1: TLabel;
Button9: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure PPaint(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button9Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
y2,x2,x,y,i,j,k,kk,Dx:integer;
v:array[1..10] of integer;
error:boolean=false;
implementation
{$R *.DFM}
procedure getparam;
begin
with form1 do
for i := 1 to 10 do
if TEdit(FindComponent(‘E’ +
IntToStr(i))).Text <>’’ then
v[i]:=StrToInt(TEdit(FindComponent(‘E’ +
IntToStr(i))).Text) else error:=true;
end;
procedure T;
begin
with form1.p do
begin
canvas.moveto((Width div 2)+(v[1]*dx),(Height div
2)-(v[2]*dx));
canvas.lineto((Width div 2)+(v[3]*dx),(Height div
2)-(v[4]*dx));
canvas.MoveTo((Width div 2)+(v[3]*dx),(Height div
2)-(v[4]*dx));
canvas.LineTo((Width div 2)+(v[5]*dx),(Height div
2)-(v[6]*dx));
canvas.MoveTo((Width div 2)+(v[5]*dx),(Height div
2)-(v[6]*dx));
canvas.LineTo((Width div 2)+(v[1]*dx),(Height div
2)-(v[2]*dx));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
getparam;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
p.Canvas.Pen.Color:=cllime;
p.Canvas.MoveTo((p.Width div 2)+(v[1]*dx),
(p.Height div 2)-(v[2]*dx));
p.Canvas.LineTo((p.Width div 2)+(v[1]*dx),
(p.Height div 2)-(v[2]*dx));
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
getparam;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
p.Canvas.Pen.Color:=cLYELLOW;
p.Canvas.Moveto((p.Width div 2)+(v[1]*dx)*v[7]
,(p.Height div 2)-(v[2]*dx));
p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*v[7]
,(p.Height div 2)-(v[2]*dx));
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
getparam;
p.Canvas.Pen.Color:=cLgreen;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
p.Canvas.moveto((p.Width div 2)+(v[1]*dx)*v[7]
,(p.Height div 2)-(v[2]*dx)*v[10]);
p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*v[7]
,(p.Height div 2)-(v[2]*dx)*v[10]);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
getparam;
p.Canvas.Pen.Color:=cLwhite;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
p.Canvas.moveto((p.Width div 2)+(v[1]*dx)*-1
,(p.Height div 2)-(v[2]*dx));
p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*-1
,(p.Height div 2)-(v[2]*dx));
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
getparam;
p.Canvas.Pen.Color:=cLAqua;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
p.Canvas.moveto((p.Width div 2)+(v[1]*dx)*-1
,(p.Height div 2)-(v[2]*dx)*-1);
p.Canvas.Lineto((p.Width div 2)+(v[1]*dx)*-1
,(p.Height div 2)-(v[2]*dx)*-1);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
getparam;
p.Canvas.Pen.Color:=cLred;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+10;
k:=(p.Height div 2)-((v[1]*v[8]+v[2])*dx);
p.Canvas. moveto((p.Width div 2)+(v[1]*dx),k);
p.Canvas. Lineto((p.Width div 2)+(v[1]*dx),k);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-10;
end;
procedure TForm1.PPaint(Sender: TObject);
var w:integer;
begin
i:=1;
w:=-10;
with p.Canvas do
begin
p.Canvas.FillRect(rect(0,0,p.width,p.height));
pen.Color:=clwhite;
moveto(p.Width div 2,0);
lineto(p.Width div 2,p.Height-0);
moveto(0,p.Height div 2);
lineto(p.Width-0,p.Height div 2);
dX:=p.Width div 20;
font.Color:=cllime;
while i<p.Width do
begin
moveto(i,(p.Height div 2));
lineto(i,(p.height div 2)+5);
if w<>0 then
textout(i-4,(p.height div 2)+6,
IntToStr(w));
i:=i+dX;
inc(w);
end;
i:=1;
w:=10;
while i<p.Height do
begin
moveto((p.width div 2),i);
lineto((p.width div 2)+5,i);
if w<>0 then
textout((p.width div 2)+5,i-7,IntToStr(w));
i:=i+dx;
dec(w);
end;
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
var k,kk:integer;
begin
getparam;
x:=(p.Width div 2)+(v[1]*dx);
y:=(p.Height div 2)-(v[2]*dx);
ppaint(form1);
x2:=(p.Width div 2)+(v[3]*dx);
y2:=(p.Height div 2)-(v[4]*dx);
p.Canvas.MoveTo(x,y);
p.Canvas.LineTo(x2,y2);
k:=((v[7]*v[1])+(v[9]*v[2]));
kk:=((v[8]*v[1])+(v[10]*v[2]));
x:=(p.Width div 2)+(k*dx);
y:=(p.Height div 2)-(kk*dx);
k:=((v[7]*v[3])+(v[9]*v[4]));
kk:=((v[8]*v[3])+(v[10]*v[4]));
x2:=(k*dx)+(p.Width div 2);
y2:=(p.Height div 2)-(kk*dx);
p.Canvas.MoveTo(x,y);
p.Canvas.LineTo(x2,y2);
end;
procedure TForm1.Button8Click(Sender: TObject);
var vv:array[0..10] of integer;
begin
getparam;
ppaint(form1);
t;
// for xy=z & y=0
for i:=1 to 10 do
vv[i]:=v[i];
vv[1]:=v[1]*v[7]+v[2]*v[9];
vv[2]:=v[1]*v[8]+v[2]*v[10];
vv[3]:=v[3]*v[7]+v[4]*v[9];
vv[4]:=V[3]*v[8]+v[4]*v[10];
vv[5]:=v[5]*v[7]+v[6]*v[9];
vv[6]:=v[5]*v[8]+v[6]*v[10];
for i:=1 to 10 do
v[i]:=vv[i];
t;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
label4.Caption:=’a : b: ‘+
#10+#13+#10+#13+#10+#13+’c : d :’;
label1.Caption:=’X1 X2
X3'+#10+#13
+#10+#13+’Y1 Y2
Y3';
end;
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.
Лабораторна робота №2
Робота в просторовій системі координат
Мета роботи: Ознайомлення з основами комп‘ютерної графіки в просторовій системі координат.
Теоретичні основи
2.1 Вступ
Для кращого сприйняття форми об’єкта необхідно мати його зображення в тривимірному просторі. У багатьох випадках наочне представлення про об’єкт можна одержати шляхом виконання операцій обертання і переносу, а також побудови проекцій. Введемо однорідні координати. Точка в тривимірному
(x y z) просторі задається чотиримірним вектором (x y z 1) або ж (X Y Z H). Перетворення з однорідних координат описується співвідношеннями
(4.1)
де T - деяка матриця перетворення.
Ця матриця може бути представлена у вигляді 4 окремих частин
Матриця 3x3 здійснює лінійне перетворення у виді зміни масштабу, зсуву й обертання. Матриця-рядок 1х3 робить перенос, а матриця-стовпець 3х1 - перетворення в перспективі. Останній скалярний елемент виконує загальну зміну масштабу. Повне перетворення, отримане шляхом впливу на вектор положення матрицею 4x4 і нормалізації перетвореного вектора, будемо називати білінійним перетворенням. Воно забезпечує виконання комплексу операцій зсуву, часткової зміни масштабу, обертання, відображення, переносу, а також зміни масштабу зображення в цілому.
