Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod_zbirna.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.09 Mб
Скачать

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 від початку координат. Для обчислення координат і 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. Таким чином, точка Р має координати:

.

Ця проекція описується матрицею

.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]