- •Комп’ютерна графіка
- •1.3 Перетворення прямих ліній (відрізків)
- •1.4 Обертання
- •1.5 Відображення
- •1.6 Зміна масштабу
- •1.7 Двовимірний зсув і однорідні координати
- •2.2 Тривимірна зміна масштабу
- •2.3 Перетворення трьохвимірних координат в двовимірні
- •2.4 Тривимірний зсув
- •2.6 Відображення в просторі
- •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. Порядковий алгоритм заповнення з запалом
- •Література
- •Комп’ютерна графіка Методичні вказівки
2.7 Просторовий перенос
Тривимірний лінійний перенос зображення задається виразом
(4.14)
Після перемножування одержимо
(4.15)
Приклад просторового переносу (l=2;m=-2;n=0)
Рис. 2.9. Просторовий перенос
2.8 Тривимірне обертання навколо довільної осі
Метод двовимірного плоского обертання навколо довільної осі був розглянений раніше. Узагальненням цього методу є спосіб обертання навколо довільної осі в тривимірному просторі. Як і для плоского обертання навколо довільної осі, розглянена процедура полягає в переносі зображення і заданої осі обертання, що забезпечує обертання навколо осі, що проходить через початок координат. Метод тривимірного обертання полягає в лінійному переносі, обертанні навколо початку координат і зворотньому лінійному переносі у вихідне положення. Якщо вісь, навколо якої виконується обертання, проходить через точку А = (1 m n 1) , то матриця перетворення визначається наступним виразом:
(4.16)
де елементи матриці обертання R розміру 4х4 визначаються в загальному випадку співвідношенням
(4.17)
Результат добутку матриць:
Рис. 2.10. Тривимірне обертання навколо довільної осі
ПОРЯДОК ВИКОНАННЯ РОБОТИ
1. Побудуйте декартову систему координат у просторі. Виберіть одну з паралельних проекцій, в якій будете відтворювати фігури: ізометричну чи аксонометричну.
2 . Задайте одиниці вимірювань (масштабування). Якщо побудова фігур у просторі буде здійснюватися у ізометричних проекціях, то кожен відрізок, напрямлений по осям x, y, z зберігає свою величину.
У диметричній проекції по осям x i Y , чи паралельно їм, відкладають всі розміри в натуральну величину, а по осі Z - розміри зменшують вдвічі.
3. Побудуйте куб з одиничними координатами.
4. Здійсніть зміну масштабу куба.
5. Задайте трьохвимірний зсув.
6. Поверніть куб навколо осей OX, OY, OZ на довільний кут.
7. Здісніть відображення в просторі щодо площин XY, YZ та XZ.
8. Перенесіть куб.
9. Здійсніть обертання куба навколо довільної осі.
ВИМОГИ ДО ЗВІТУ
Звіт повинен містити:
1) назву роботи;
2) мету роботи;
3) короткий теоретичний вступ;
4) завдання до лабораторної роботи;
5) тексти розроблених і відлагоджених програм
6) малюнки з реалізацією програми
7) висновки
ПРИКЛАД ПРОГРАМНОЇ РЕАЛІЗАЦІЇ
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,math;
const
qw=2;
fon=clPurple;
type
b=array[1..8,1..4] of Extended;
m=array[1..4,1..4] of Extended;
TForm1 = class(TForm)
E1_1: TEdit;
e1_2: TEdit;
Label1: TLabel;
e2_3: TEdit;
e2_4: TEdit;
e3_1: TEdit;
Button1: TButton;
P: TPaintBox;
Button2: TButton;
e3_2: TEdit;
e1_3: TEdit;
e1_4: TEdit;
e2_1: TEdit;
E2_2: TEdit;
e3_3: TEdit;
e3_4: TEdit;
e4_1: TEdit;
e4_2: TEdit;
e4_3: TEdit;
e4_4: TEdit;
C: TCheckBox;
Button3: TButton;
Grad: TEdit;
Panel1: TPanel;
r1: TRadioButton;
r2: TRadioButton;
r3: TRadioButton;
r4: TRadioButton;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label3: TLabel;
procedure PPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
z,y2,x2,x,y,i,j,k,kk,x_temp:integer;
box:b;
matrix:m;
cikl:boolean=false;
implementation
{$R *.DFM}
procedure mat(var p:b;pp:m);
var temp:array[1..8,1..4]of real;
begin
for i:=1 to 8 do
for j:=1 to 4 do
temp[i,j]:=0 ;
for i:=1 to 8 do
for j:=1 to 4 do
for z:=1 to 4 do
temp[i,j]:=temp[i,j]+(p[i,z]*pp[j,z]);
for i:=1 to 8 do
for j:=1 to 4 do
p[i,j]:=temp[i,j];
end;
function X_ (a:real):integer;
begin
result:=round((form1.P.Width div 2)+(a*x_temp));
end;
function y_ (a:real):integer;
begin
result:=round((form1.P.height div 2)-a*(x_temp ));
end;
procedure getparam;
begin
with form1 do
for i:=1 to 4 do
for j:=1 to 4 do
if TEdit(FindComponent(‘E’ +
IntToStr(i)+’_’+IntToStr(j))).Text <>’’ then
matrix[i,j]:=StrTofloat(TEdit (FindComponent(‘E’ +
IntToStr(i)+’_’+IntToStr(j))).Text);
end;
procedure Draw; //x=x-z*sin(alpha)
begin //y=y-z*sin(alpha)
with form1.p.Canvas do //alpha=30
begin
pen.Width:=pen.Width+2;
MoveTo(x_(box[1,1]-box[1,3]/2),y_(box[1,2]-box[1,3]/2));//000
pen.Color:=cllime;
lineto(x_(box[2,1]-box[2,3]/2),Y_(box[2,2]-box[2,3]/2));//001
lineto(x_(box[6,1]-box[6,3]/2),Y_(box[6,2]-box[6,3]/2));//101
lineto(x_(box[5,1]-box[5,3]/2),Y_(box[5,2]-box[5,3]/2));//100
lineto(x_(box[1,1]-box[1,3]/2),Y_(box[1,2]-box[1,3]/2));//000
moveto(x_(box[3,1]-box[3,3]/2),Y_(box[3,2]-box[3,3]/2));//010
lineto(x_(box[4,1]-box[4,3]/2),Y_(box[4,2]-box[4,3]/2));//011
lineto(x_(box[8,1]-box[8,3]/2),Y_(box[8,2]-box[8,3]/2));//111
lineto(x_(box[7,1]-box[7,3]/2),Y_(box[7,2]-box[7,3]/2));//110
lineto(x_(box[3,1]-box[3,3]/2),Y_(box[3,2]-box[3,3]/2));//010
moveto(x_(box[4,1]-box[4,3]/2),Y_(box[4,2]-box[4,3]/2));//011
lineto(x_(box[2,1]-box[2,3]/2),Y_(box[2,2]-box[2,3]/2));//001
moveto(x_(box[8,1]-box[8,3]/2),Y_(box[8,2]-box[8,3]/2));//111
lineto(x_(box[6,1]-box[6,3]/2),Y_(box[6,2]-box[6,3]/2));//101
moveto(x_(box[7,1]-box[7,3]/2),Y_(box[7,2]-box[7,3]/2));//110
lineto(x_(box[5,1]-box[5,3]/2),Y_(box[5,2]-box[5,3]/2));//100
moveto(x_(box[3,1]-box[3,3]/2),Y_(box[3,2]-box[3,3]/2));//010
lineto(x_(box[1,1]-box[1,3]/2),Y_(box[1,2]-box[1,3]/2));//000
pen.Color:=fon;
pen.Width:=pen.Width-2;
end;
end;
procedure TForm1.PPaint(Sender: TObject);
begin
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 div 2));
moveto(p.Width div 2,p.Height div 2);
lineto(p.Width ,p.Height div 2);
moveto(p.Width div 2,p.Height div 2);
lineto(70,p.Height-70);
i:=(p.width div 2)+x_temp;
while i<p.Width do
begin
moveto(i,(p.Height div 2)-10);
lineto(i,(p.height div 2)+10);
i:=i+x_temp ;
end;
i:=0;
while i<(p.Height div 2)-x_temp do
begin
moveto((p.width div 2)-10,i);
lineto((p.width div 2)+10,i);
i:=i+x_temp;
end;
i:=52+x_temp;
j:=p.Height-i;
while i<(p.Width div 2) do
begin
moveto(i-14,j);
lineto(i+1,j+10);
i:=i+x_temp div 2;
j:=j-x_temp div 2;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var t,tt:integer;
begin
x_temp:=p.Width div 20;
t:=1;
tt:=1;
label1.Caption:=’y\x 1 2 3 4'+
#10+#13+’1'+#10+#13+ ’2'+#10+#13+’3'+#10+#13+’4';
// kub 1x1x1
for j:=1 to 4 do
for i:=1 to 8 do
case j of
4:box[i,j]:=qw;
1: if i<=4 then box[i,j]:=0 else box[i,j]:=qw;
3: if (i mod 2)=0 then box[i,j]:=qw else box[i,j]:=0;
2: begin
if t>2 then
begin
t:=1;
tt:=tt*-1;
end;
if tt=1 then box[i,j]:=0 else box[i,j]:=qw;
inc(t);
end;
end;
button1.Caption:=’Побудова одиничного куба’;
button1.Caption:=’Операції над кубом’;
button1.Caption:=’Поворот’;
label3.Caption:=’ N1 N2 N3';
label2.Caption:=’КУТ :’;
R1.Caption:=’По X’;
r2.Caption:=’По Y’;
r3.Caption:=’По Z’;
r4.Caption:=’По уявній (XYZ)’;
c.Caption:=’ПЕРЕМАЛЬОВКА’;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
formcreate(form1);
if c.Checked then ppaint(form1);
draw;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
formcreate(form1);
getparam;
if c.Checked then ppaint(form1);
mat(box,matrix);
draw;
end;
procedure TForm1.Button3Click(Sender: TObject);
var matrix_:m;
begin
if c.Checked then ppaint(form1);
for i:=1 to 4 do
for j:=1 to 4 do
matrix[i,j]:=0 ;
if r1.Checked then
begin
matrix[1,1]:=1;
matrix[4,4]:=1;
matrix[2,2]:= cos(DegToRad(StrTofloat(grad.text)));
matrix[2,3]:= SIN(DegToRad(StrTofloat(grad.text)));
matrix[3,2]:=-matrix[2,3];
matrix[3,3]:=matrix[2,2];
end;
if r2.Checked then
begin
matrix[2,2]:=1;
matrix[4,4]:=1;
matrix[1,1]:= cos(DegToRad(StrToFloat(grad.text)));
matrix[1,3]:=-sin(DegToRad(StrToFloat(grad.text)));
matrix[3,1]:=-matrix[1,3];
matrix[3,3]:=matrix[1,1];
end;
if r3.Checked then
begin
matrix[3,3]:=1;
matrix[4,4]:=1;
matrix[1,1]:= cos(DegToRad(StrToFloat(grad.text)));
matrix[1,2]:= sin(DegToRad(StrToFloat(grad.text)));
matrix[2,1]:=-matrix[1,2];
matrix[2,2]:=matrix[1,1];
end;
if r4.Checked then
begin
getparam;
matrix_[1,4]:= cos(DegToRad(StrToFloat(Edit1.Text)));
matrix_[2,4]:= cos(DegToRad(StrToFloat(Edit2.Text)));
matrix_[3,4]:= cos(DegToRad(StrToFloat(Edit3.Text)));
matrix_[1,1]:= sqr(StrToFloat(Edit1.Text))+(1-sqr(StrToFloat(Edit1.Text))) *cos(DegToRad(StrToFloat(grad.text)));
matrix_[1,2]:= StrToFloat(Edit2.Text) *StrToFloat(Edit1.Text)*(1-cos(DegToRad(StrToFloat(grad.text))))-(StrToFloat(Edit3.Text)* sin(DegToRad(StrToFloat(grad.text))));
matrix_[1,3]:= StrToFloat(Edit3.Text) *StrToFloat(Edit1.Text)*(1-cos(DegToRad(StrToFloat(grad.text))))+ (StrToFloat(Edit2.Text) *sin(DegToRad(StrToFloat(grad.text))));
matrix_[1,4]:=0;
matrix_[2,1]:= StrToFloat(Edit2.Text)*StrToFloat(Edit1.Text)*(1-cos(DegToRad(StrToFloat(grad.text))))+ (StrToFloat(Edit3.Text)* sin(DegToRad(StrToFloat(grad.text))));
matrix_[2,2]:= sqr(StrToFloat(Edit2.Text))+(1-sqr(StrToFloat(Edit2.Text))) *cos(DegToRad(StrToFloat(grad.text)));
matrix_[2,3]:= StrToFloat(Edit2.Text) *StrToFloat(Edit3.Text)*(1-cos(DegToRad(StrToFloat(grad.text))))-(StrToFloat(Edit1.Text) *sin(DegToRad(StrToFloat(grad.text))));
matrix_[2,4]:=0;
matrix_[3,1]:= StrToFloat(Edit3.Text)* StrToFloat(Edit1.Text)*(1-cos(DegToRad(StrToFloat(grad.text))))-(StrToFloat(Edit2.Text)* sin(DegToRad(StrToFloat(grad.text))));
matrix_[3,2]:= StrToFloat(Edit2.Text)* StrToFloat(Edit3.Text)*(1-cos(DegToRad(StrToFloat(grad.text)))) +(StrToFloat(Edit1.Text)* sin(DegToRad(StrToFloat(grad.text))));
matrix_[3,3]:= sqr(StrToFloat(Edit3.Text))+(1-sqr(StrToFloat(Edit3.Text)))*
cos(DegToRad(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.
Лабораторна робота №3
Паралельні та косокутні Проекції
Мета роботи: Ознайомлення елементарним математичним апаратом плоских геометричних проекцій
Теоретичні основи
3.1 Паралельні проекції
Будемо вважати, що при центральному проектуванні картинна площина перпендикулярна осі z і збігається з площиною z = d, а при паралельному збігається з площиною z = 0. Проекції розглядаються в системі координат спостерігача, що є лівосторонньою. Система координат, в якій вісь х спрямована вправо, вісь у - вгору, а вісь z - усередину екрана, природньо погоджується з екраном дисплея.
На рис.3.1 наведені три зображення лівосторонньої системи координат, у яких точка P проектується на проекційну площину, розташовану на відстані d від початку координат. Для обчислення координат Xр і Yp проекції точки (x, у, z) напишемо співвідношения, отримані з подібності трикутників (рис.4.14):
Перемножуючи обидві сторони кожного співвідношення на d, одержимо
Відстань d є в даному випадку масштабним множником, застосованим до координат Xp і Yp. Фактором, що приводить до того, що на центральній проекції більш віддалені об’єкти виглядають дрібніше, ніж ближчі, є ділення на z. Відзначимо, що допустимі всі значення z, крім z = 0. Точки можуть розташовуватися як за центром проекції на від’ємній частині осі z, так і між центром проекції і проекційною площиною.
Ці перетворення можна представити у вигляді матриці розміром 4х4:
.
Множачи
точку
на
матрицю Мцентр
. отримаємо загальний вираз для точки
в однорідних координатах ( X
Y
Z
W)
:
.
Рис.3.1. Центральна проекція
Рис.3.2. Інша схема побудови центральної проекції
Тепер, поділивши на W (що дорівнює z/d) для зворотнього переходу до трьох вимірів, отримаємо
При іншому представленні центрального проектування, застосовуваному в деяких роботах, проекційна площина сполучається з площиною 2 = 0, а центр проекції розташовується в точці 2 = - с (рис.3.2). З подібності трикутників випливає
.
Звідси одержуємо
Ортографічне проектування на площину z = 0 очевидне. Напрямок проектування збігається з нормаллю до площини проекції, тобто в нашому випадку з віссю z. Таким чином, точка Р має координати:
.
Ця проекція описується матрицею
.
