Лабораторна робота № 6
Тема. Тривимірні
перетворення координат
Вступ
Більшість геометричних перетворень, з якими стикається інженер у
практичній діяльності, реалізується в тривимірному просторі (рух робота із
захопленням об'єкта, зображення об'ємної деталі і т.д.).
Існує ряд нелінійних тривимірних систем відліку: циліндричні, сферичні та ін.
Але найбільш часто застосовуються афінні перетворення, оскільки вони не
змінюють форму тіл. Загальна структура рівнянь, що використовуються в процесі
таких перетворень, така ж, як і за двох координат, але рівнянь три:
x2=axxx1+axyy1+axzz1+ax,
y2=ayxx1+ayyy1+ayzz1+ay,
z2=azxx1+azyy1+azzz1+az..
При цьому 9-членна квадратна матриця використовується для
реалізації повороту точки навколо осей, а 3-членний вектор здійснює її
перенесення в тримірному просторі. На відміну від повороту на площині в
просторі поворот задається послідовним обертанням навколо трьох координатних
осей. При цьому для кожної осі існує своя матриця повороту. Поворот на кут 0 щодо
осі 2 здійснюється матрицею:
.
Аналогічно виконується поворот на кут 0 щодо осі Y:
.
Поворот на кут Ө щодо осі X проводиться за допомогою
аналогічної матриці перетворення:
.
Масштабування має також свою матрицю, але в даній роботі
обмежуємося тільки двома розглянутими вище видами перетворень як
найважливішими.
Окремою і важливою проблемою, що виникає під час виконання даної
лабораторної роботи, є відображення тривимірного простору на площину. З курсу
інженерної графіки відомо, що найбільш поширені аксонометричні проекції які, у свою чергу, діляться на триметрію (всі показники спотворення по осях різні), диметрію (два показники спотворення рівні, третій відрізняється
від них) і ізометрію (всі три показники спотворення рівні). Конкретні види
аксонометричних проекцій наведені на рис. 8.1. Для прикладу розглянемо
відображення прямокутної ізометричної проекції на двовимірну систему координат,
відповідну екрану дисплея (рис. 8.2). Центри систем відліку суміщені. Вісь у
двовимірній системі співпадає з віссю 2 тримірного простору. З рис. 8.2 видно,
що:
Mx2 =
My3*cos30° - Mx3*cos30° = cos30°*(My3 - Mx3)
= 0.87*(My3
- Mx3),
My2
= Mz3 – (My3*sin30° + Mx3*sin30°) = Mz3
– 0.5*(My3
+ Mx3).
Відповідно до вимог ізометричної проекції всі тривимірні
координати повинні домножуватися на коефіцієнт 0,82.
Тому остаточні вирази для двовимірних координат мають вигляд:
Mx2 = 0.82*0.87*(My3 - Mx3) = 0.71*(My3 - Mx3),
My2 = 0.82*(Mz3 – 0.5*(My3 - Mx3)).
Опис середовища програмування
Для спрощення процесу реалізації програми пропонується
використовувати відеорежим з роздільною здатністю
640×480, що усуває необхідність в масштабуванні кінцевого зображення на
екрані, дозволяючи зосередити основну увагу на процедурі перетворення
тривимірних координат на площину.
а)
б)
в) |
г) |
д)
Рис. 8.1. Види
аксонометричних проекцій:
а) прямокутна ізометрична
проекція; U=W=V=0.82; б) прямокутна диметрична
проекція; U=W=0.94, V=0.47; в) косокутна фронтальна ізометрична проекція U=W=V=1; г) косокутна
горизонтальна ізометрична проекція U=W=V=1; д) косокутна
фронтальна ізометрична проекція U=W=1, V=0.5; д) косокутна фронтальна симетрична проекція: U=W=1, V=0.5
Рис. 8.2. Відображення прямокутної
ізометричної проекції на двовимірну систему координат
Приклад
програми. Створити програму, яка реалізовує засобами
графіки мови програмування Turbo Pascal
таке зображення: косокутна горизонтально ізометрія Т –подібна фігура початково
розміщена в площині XY, а потім зсувається по осі Х на 150 пікселів, а по осі Y
– на 40 пікселів, повертаючись навколо осі Y на 20° проти годинникової стрілки,
навколо осі Х на 40° за годинниковою стрілкою.
Лістинг програми
program
linii3;
uses
Graph,Crt;
var
GraphDriver:integer;
GraphMode:integer;
x11,x12,x21,x22,y11,y12,y21,y22,z11,z12,z21,z22:real;
x11y,x12y,x21y,x22y,y11y,y12y,y21y,y22y,z11y,z12y,z21y,z22y:real;
x11x,x12x,x21x,x22x,y11x,y12x,y21x,y22x,z11x,z12x,z21x,z22x:real;
x11m,x12m,x21m,x22m,y11m,y12m,y21m,y22m,z11m,z12m,z21m,z22m:real;
dx,dy:integer;
sy,sx:real;
ax,ay:real;
procedure
XYZ(xn,yn:integer);
begin
SetLineStyle(0,0,1);
Line(xn,yn,xn,5);
Line(xn,5,xn-5,15);
Line(xn,5,xn+5,15);
Line(xn,yn,200,450);
Line(200,450,200,440);
Line(200,450,210,445);
Line(xn,yn,580,yn+Round((580-dx)*0.5774));
Line(580,yn+Round((580-dx)*0.5774),576,yn+Round((580-dx)*0.5774)-10);
Line(580,yn+Round((580-dx)*0.5774),569,yn+Round((580-dx)*0.5774));
SetColor(14);
SetTextJustify(0,0);
SetTextStyle(0,0,1);
OutTextXY(195,435,'X');
OutTextXY(590,yn+Round((580-dx)*0.5774),'Y');
OutTextXY(xn-15,15,'Z');
end;
procedure
Linii(x11p,x12p,y11p,y12p,z11p,z12p,x21p,x22p,y21p,y22p,z21p,z22p:real);
begin
SetLineStyle(0,0,3);
SetColor(8);
Line(dx+Round(0.5*(y11p-x11p)),dy+Round(-z11p+0.5*(x11p+y11p)),
dx+Round(0.5*(y12p-x12p)),
dy+Round(-z12p+0.5*(x12p+y12p)));
SetColor(10);
Line(dx+Round(0.5*(y21p-x21p)),
dy+Round(-z21p+0.5*(x21p+y21p)),
dx+Round(0.5*(y22p-x22p)),
dy+Round(-z22p+0.5*(x22p+y22p)));
end;
begin
GraphDriver:=Detect;
InitGraph(GraphDriver,GraphMode,'C:\BPZ\BGI');
SetBkColor(9);
ClearDevice;
dx:=320;
dy:=250;
XYZ(dx,dy);
x11:=40;
y11:=40;
z11:=0;
x12:=40;
y12:=140;
z12:=0;
x21:=40;
y21:=90;
z21:=0;
x22:=80;
y22:=90;
z22:=0;
Linii(x11,x12,y11,y12,z11,z12,x21,x22,y21,y22,z21,z22);
Readln;
ay:=20*3.14/180;
ax:=40*3.14/180;
sx:=150;
sy:=80;
X11y:=x11+z11*sin(ax);
Y11y:=y11*cos(ax)-sin(ax)*z11;
Z11y:=y11*sin(ax)+z11*cos(ax);
X12y:=x12+z12*sin(ax);
Y12y:=y12*cos(ax)-sin(ax)*z12;
Z12y:=y12*sin(ax)+z12*cos(ax);
X21y:=x21+z21*sin(ax);
Y21y:=y21*cos(ax)-sin(ax)*z21;
Z21y:=y21*sin(ax)+z21*cos(ax);
X22y:=x22+z22*sin(ax);
Y22y:=y22*cos(ax)-sin(ax)*z22;
Z22y:=y22*sin(ax)+z22*cos(ax);
Linii(x11y,x12y,y11y,y12y,z11y,z12y,x21y,x22y,y21y,y22y,z21y,z22y);
Readln;
x11x:=x11y*cos(ay)+z11y*sin(ay);
y11x:=y11y;
z11x:=-x11y*sin(ay)+z11y*cos(ay);
x12x:=x12y*cos(ay)+z12y*sin(ay);
y12x:=y12y;
z12x:=-x12y*sin(ay)+z12y*cos(ay);
x21x:=x21y*cos(ay)+z21y*sin(ay);
y21x:=y21y;
z21x:=-x21y*sin(ay)+z21y*cos(ay);
x22x:=x22y*cos(ay)+z22y*sin(ay);
y22x:=y22y;
z22x:=-x22y*sin(ay)+z22y*cos(ay);
Linii(x11x,x12x,y11x,y12x,z11x,z12x,x21x,x22x,y21x,y22x,z21x,z22x);
Readln;
x11m:=x11x+sx;
x12m:=x12x+sx;
x21m:=x21x+sx;
x22m:=x22x+sx;
y11m:=y11x+sy;
y12m:=y12x+sy;
y21m:=y21x+sy;
y22m:=y22x+sy;
z11m:=z11x;
z12m:=z12x;
z21m:=z21x;
z22m:=z22x;
Linii(x11m,x12m,y11m,y12m,z11m,z12m,x21m,x22m,y21m,y22m,z21m,z22m);
Readln;
CloseGraph;
end.
Варіанти завдань
Створити програму, яка реалізує засобами графіки мови
програмування TurboPascal зображення, включаючи:
а) згідно з наведеними нижче по варіантах завданням проекцію
тривимірних координат;
б) на початку координат початкове зображення;
в) перетворене у відповідності з завданням зображення:
1.
прямокутна ізометрична проекція. ± − подібна фігура
початково розміщена в площині XY, а потім зсувається по осі X на 70 пікселів,
осі Y − на 40 пікселів і повертається навколо осі Z на 60°, осі X −
на 120° за годинниковою стрілкою;
2.
прямокутна симетрична проекція. L − подібна фігура
початково розміщена в площині XZ, а потім зсувається по осі Y на 140 пікселів,
по осі Z − на 70 пікселів і повертається навколо осі Y на 70° за
годинниковою стрілкою, навколо осі X на 50° проти годинникової стрілки;
3.
косокутна фронтальна ізометрична проекція ┌─ –
подібна фігура початково розміщена в площині YZ, а потім зсувається по осі Y на
80 пікселів, а по осі Z − на 100 пікселів, повертаючись навколо осі Z на
90° за годинниковою, а навколо осі Y на 120° проти годинникової стрілки;
4.
косокутна горизонтальна ізометрична проекція, < −
подібна фігура початково розміщена в площині XY, а потім зсувається по осі X на
50 пікселів, а по осі Y на 130 пікселів, повертаючись навколо осі Y на 80°
проти годинникової стрілки, навколо осі X на 90° за годинниковою стрілкою;
5.
прямокутна ізометрична проекція || – подібна фігура початково
розміщена в площині XY, а поті повертається на 90º проти годинникової
стрілки навколо осей X і Y, зсуваючись на 150 пікселів по осі Х і на 100
пікселів по осі Y;
6.
прямокутна ізометрична проекція. —| – подібна фігура початково
розміщена в площині XY, а потім зсувається по осі X на 90 пікселів, осі Y
− на 140 пікселів і повертається навколо осі Z на 80°, осі X − на
100° за годинниковою стрілкою;
7.
прямокутна симетрична проекція. X − подібна фігура
початково розміщена в площині XZ, а потім зсувається по осі Y − на 90
пікселів по осі Z − на 170 пікселів і повертається навколо осі Y на 45°
за годинниковою стрілкою, навколо осі X на 70 проти годинникової стрілки;
8.
косокутна фронтальна ізометрична проекція. |—| − подібна
фігура початково розміщена в площині YZ, а потім зсувається по осі Y на 180
пікселів, по осі Z − на 70 пікселів, повертаючись навколо осі Z на 90° за
годинниковою, а навколо осі Y на 110° проти годинникової стрілки;
9.
косокутна горизонтальна ізометрична проекція. ||- – подібна
фігура початково розміщена в площині XY, а потім зсувається по осі X на 150
пікселів, а по осі Y на − 130 пікселів, повертаючись навколо осі Y на 50°
проти годинникової, навколо осі X на 40° за годинниковою стрілкою.
10.
косокутна фронтальна симетрична проекція. II − подібна
фігура початково розміщена в площині XZ, а потім зсувається по осі X на 90
пікселів, по осі Z − на 70 пікселів, повертаючись навколо осі Y на 30°,
навколо осі Z на 110° проти годинникової стрілки;
11.
прямокутна ізометрична проекція , ├ – подібна фігура початково розміщена в площині XY, а
потім зсувається по осі X на 70 пікселів, по осі Y - на 800 пікселів і
повертається навколо осі Z на 50°, осі X - на 100° за годинниковою стрілкою;
12.
прямокутна симетрична проекція, ⌂-подібна
фігура початково розмішена в площині XZ, а потім зсувається по осі Y на 60
пікселів, по осі Z − на 120 пікселів і повертається навколо осі Y на 90°
за годинниковою стрілкою, навколо осі X на 80 пікселів проти годинникової
стрілки;
13.
косокутна фронтальна ізометрична проекція, Δ – подібна
фігура початково розміщена в площині YZ, а потім зсувається по осі Y на 80
пікселів, по осі Z − на 120 пікселів, повертаючись навколо осі Z на 90°
за годинниковою, а навколо осі Y на 120 пікселів проти годинникової стрілки;
14.
косокутна горизонтальна ізометрична проекція, р – подібна фігура
початково розміщена в площині XY, а потім зсувається по осі X на 150 пікселів,
а по осі Y − на 40 пікселів, повертаючись навколо осі Y на 20 проти
годинникової стрілки, навколо осі X на 40° за годинниковою стрілкою;
15.
косокутна фронтальна симетрична проекція. Н – подібна фігура
початково розміщена в площині XZ, а потім зсувається по осі X на 40 пікселів,
по осі Z - на 140 пікселів, повертаючись навколо осі Y на 40°, навколо осі Z на
150° проти годинникової стрілки;
16.
прямокутна ізометрична проекція. ╪ – подібна фігура
початково розміщена в площині XY, а потім зсувається по осі X на 40 пікселів,
осі Y − на 90 пікселів і повертається навколо осі Z на 50°, осі X −
100° за годинниковою стрілкою;
17.
прямокутна симетрична проекція. И – подібна фігура початково
розміщена в площині XZ, а потім зсувається по осі Y на 130 пікселів, по осі Z
− на 70 пікселів і повертається навколо осі Y на 45° за годинниковою
стрілкою, навколо осі X на 90° проти годинникової стрілки;
18.
косокутна фронтальна ізометрична проекція. X − подібна
фігура початково розміщена в площині YZ, а потім зсувається по осі Y на 80
пікселів, по осі Z − на 120 пікселів, повертаючись навколо осі Z на 90°
за годинниковою, а навколо осі Y на 120 пікселів проти годинникової стрілки;
19.
косокутна горизонтальна ізометрична проекція. ◊ −
подібна фігура початково розміщена в площині XY, а потім зсувається по осі X на
80 пікселів, а по осі Y на 110 пікселів, повертаючись навколо осі Y на 70°
проти годинникової стрілки, навколо осі X на 70° за годинниковою стрілкою;
20.
косокутна фронтальна ізометрична проекція. ≠ −
подібна фігура початково розміщена в площині XZ, а потім зсувається по осі X на
80, по осі Z − на 50 пікселів, повертаючись навколо осі Y на 60°, навколо
осі Z на 140° проти годинникової стрілки;
21.
┌┘ − подібна фігура початково розміщена в
площині YZ, а потім зсувається по осі Y на 80 пікселів, по осі Z − на 120
пікселів, повертаючись навколо осі Z на 90° за годинниковою, а навколо осі У на
120 пікселів проти годинникової стрілки;
22.
┴┴ – подібна фігура початково розміщена в площині
YZ, а потім зсувається по осі У на 80 пікселів, по осі Z − на 120
пікселів, повертаючись навколо осі Z на 90° за годинниковою, а навколо осі У на
120 пікселів проти годинникової стрілки;
23.
┌┐– подібна фігура початково розміщена в площині ХY, а потім
зсувається по осі X на 150 пікселів, а по осі Y на − 130 пікселів,
повертаючись навколо осі Y на 50° проти годинникової, навколо осі X на 40° за годинниковою
стрілкою;
24.
# – подібна фігура початково розміщена в площині ХY, а потім
зсувається по осі X на 90 пікселів, осі Y − на 140
пікселів і повертається навколо осі Z на 80°, осі X - на 100° за годинниковою
стрілкою;
25.
|-| − подібна фігура початково розміщена в площині ХY, а потім
зсувається по осі X на 70 пікселів, осі Y − на 40
пікселів і повертається навколо осі Z на 60°, осі X - на 120° за годинниковою
стрілкою;
26.
|—|− – подібна
фігура початково розміщена в площині ХY, а потім зсувається по осі
X на 70 пікселів, по осі Y - на 800 пікселів і повертається навколо осі Z на 50°, осі X - на
100° за годинниковою стрілкою;
27.
│├ − подібна фігура початково розміщена в
площині XZ, а потім зсувається по осі Y на 140 пікселів, по осі Z
− на 70 пікселів і повертається навколо осі Y на 70° за
годинниковою стрілкою, навколо осі X на 50° проти годинникової стрілки;
28.
↑ − подібна фігура початково розміщена в площині XZ, а потім
зсувається по осі Y на 130 пікселів, по осі Z − на 70 пікселів
і повертається навколо осі У на 45° за годинниковою стрілкою, навколо осі X на
90° проти годинникової стрілки;
29.
│├ − подібна фігура початково розміщена в площині
XZ, а потім зсувається по осі X на 40, по осі Z − на 70 пікселів,
повертаючись навколо осі У на 60°, навколо осі Z на 100° проти
годинникової стрілки;
30.
|
| − подібна фігура
початково розміщена в площині XZ, а потім зсувається по осі X на 80, по осі Z -
на 50 пікселів, повертаючись навколо осі У на 60°, навколо осі Z на 140° проти
годинникової стрілки.
Зміст звіту
1)
Зміст завдання;
2)
лістинг програми;
3)
надруковане зображення.
Контрольні питання
1.
Чи зміниться результат тривимірних перетворень, якщо змінити
місцями зсув і поворот?
2.
Які існують види тривимірних проекцій?
3.
Чому проміжні координати перетворюючого зображення в програмі
прикладу визначені як змінні типу real, а кінцеві
− типу integer?
4.
Яка роздільна здатність екрану не потребує введення масштабуючих коефіцієнтів?
5.
Чому під час відображення тривимірної прямокутної системи
координат на площині розрахунок координати X двомірної системи не враховує
значення координати Z тривимірної системи?