- •Методические указания
- •Лабораторная работа №8 Преобразование двумерных координат. Динамическое Преобразование координат.
- •Пример программы
- •Динамическое преобразование двумерных координат
- •Пример программы
- •Пример программы
- •6. Варианты задания
- •7. Контрольные вопросы
- •Библиографический список
- •Содержание
- •394026 Воронеж, Московский просп., 14
Динамическое преобразование двумерных координат
Данный вид изображений находит широкое применение в компьютерной графике для синтеза мнемосхем, моделирования технологических процессов и перемещений роботов, расширения изобразительных возможностей человеко-машинного интерфейса.
Пример программы
В локальной системе координат нарисовать две параллельные вертикальные линии. Нижняя координата левой линии находится в точке (20, 10). Сдвинуть данную точку до координаты (60, 90) с дискретом 1 пиксель, поворачивая рисунок на каждом шаге на 1о против часовой стрелки.
Листинг программы
Program Povorot;
uses
Graph, Crt; {подключение требуемых модулей}
var
GraphDriver:integer; {номер графического драйвера}
GraphMode:integer; {номер графического подрежима}
mx, my:word; {коэффициенты масштабирования изображения}
x11, x12, x21, x22, y11, y12, y21, y22:integer; {координаты концевых точек линий в локальной системе координат}
dx, dy:integer; {смещение локальной системы координат относительно глобальной}
a:real; {угол поворота в радианах}
y:integer; {угол поворота в градусах}
i:byte; {переменная цикла}
sx, sy:integer; {величина сдвига изображения по осям X и Y в локальной системе координат}
ns:byte; {номер графической страницы}
procedure XY(xn, yn:integer); {процедура создания на экране локальных координат. Листинг смотри в предыдущем примере }
begin
GraphDriver:=3;
GraphMode:=1;
InitGraph(GraphDriver, GraphMode, '');
SetBkColor(9); {установка цвета фона изображения}
GetAspectRatio(mx, my); {определение коэффициентов масштабирования}
dx:=320; {задание величин сдвига локальной системы координат относительно глобальной}
dy:=300;
y:=0; {начальная величина угла поворота в градусах}
sy:=0; {начальная величина сдвига изображения по оси Y в локальной системе координат}
ns:=0; {номер активной графической страницы}
x11:=20; {координаты концов линий в локальной системе координат}
y11:=10;
x12:=20;
y12:=110;
x21:=70;
y21:=10;
x22:=70;
y22:=110;
for sx:=0 to 80 do {цикл по величине сдвига изображения по оси X относительно локальной системы координат}
begin
if ns=0 then {смена активной и видимой графических страниц}
begin
SetActivePage(0);
SetVisualPage(1)
end
else
begin
SetActivePage(1);
SetVisualPage(0)
end;
ClearDevice; {очистка активной страницы}
XY(dx, dy): {вычерчивание локальной системы координат}
SetColor(7); {установка цвета линий в исходном положении}
SetLineStyle(0, 0, 3); {установка толщины линий в исходном положении}
{отображение линий в исходном положении}
Line(dx+x11, dy-Round(mx/my*y11), dx+x12, dy-Round(mx/my*y12));
Line(dx+x21, dy-Round(mx/my*y21), dx+x22, dy-Round(mx/my*y22));
a:=y*6.28/360; {определение величины угла в радианах}
SetColor(13); {установка цвета перемещаемых линий}
{отображение перемещаемых линий}
Line(dx+Round(cos(a)*x11-sin(a)*y11)-sx, dy-(Round(mx/my*(sin(a) *x11 +cos(a) *y11+sy))), dx+Round(cos(a)*x12-sin(a)*y12)-sx, dy-(Round(mx/my*(sin(a)*x12 +cos(a)*y12+sy))));
Line(dx+Round(cos(a)*x21-sin(a)*y21)-sx, dy-(Round(mx/my*(sin(a)*x21 +cos(a) *y21+sy))), dx +Round(cos(a)*x22-sin(a)*y22)-sx, dy-(Round(mx/my*(sin(a)*x22 +cos(a)*y22+sy))));
y:=y+1; {изменение величины угла поворота в градусах}
sy:=sy+1; {изменение величины сдвига по оси Y относительно локальной системы координат }
if ns=0 then {смена номера активной графической страницы}
ns:=1
else
ns:=0;
Delay(500); {задержка изображения на каждом шаге перемещения}
end;
Readln; {остановка изображения до нажатия любой клавиши}
Closegraph; {выход из графического режима}
end.
В данном варианте реализации задания на каждом шаге цикла производится повторное построение координатных осей, так как они уничтожаются при очередной очистке экрана. Вариант со стиранием на каждом шаге только перемещающихся линий приводит к тому, что исчезает и часть координатных осей, если они пересекаются линиями при движении. Последний вариант может быть реализован только при перемещении изображения в первом квадранте.
Преобразование трехмерных координат
Большинство геометрических преобразований, с которыми сталкивается инженер в практической деятельности, реализуется в трехмерном пространстве (движение робота с захватом объекта, изображение объемной детали и т.д.). Существует ряд нелинейных трехмерных систем отсчета: цилиндрические, сферические и др., но наиболее часто используются аффинные преобразования, так как они не меняют форму тел. Общая структура уравнений, используемых в процессе таких преобразований, та же, что и при двух координатах, но теперь уравнений три
x2 = axxx1 + axyy1 + axzz1 + ax,
y2 = ayxx1 + ayyy1 + ayzz1 + ay,
z2 = azxx1 + azyy1 + azzz1 + az,
При этом 9-членная квадратная матрица используется для реализации поворота точки вокруг осей, а 3-членный вектор осуществляет ее перенос в трехмерном пространстве. В отличие от поворота на плоскости в пространстве поворот задается последовательным вращением вокруг трех координатных осей. При этом для каждой оси существует своя матрица поворота. Поворот на угол Θ относительно оси z осуществляется матрицей
|
cosΘ |
-sinΘ |
0 |
Rz = |
sinΘ |
cosΘ |
0 |
|
0 |
0 |
1 |
Аналогично выполняется поворот на угол Θ относительно оси y
|
cosΘ |
0 |
sinΘ |
Ry = |
0 |
1 |
0 |
|
-sinΘ |
0 |
cosΘ |
Поворот на угол Θ относительно оси x производится с помощью аналогичной мат-рицы преобразования
|
1 |
0 |
sinΘ |
Rx = |
0 |
cosΘ |
-sinΘ |
|
0 |
sinΘ |
cosΘ |
Масштабирование имеет также свою матрицу, но в данной работе ограничимся только двумя рассмотренными выше видами преобразования как наиболее важными.
Отдельной и важной проблемой, возникающей при выполнении данной лабораторной работы, является отображение трехмерного пространства на плоскость. Как известно из курса инженерной графики наиболее широко распространены аксонометрические проекции, которые, в свою очередь, делятся /3/ на триметрию (все показатели искажения по осям различны), диметрию (два показателя искажения равны, третий отличен от них) и изометрию (все три показателя искажения равны). Конкретные виды аксонометрических проекций приведены на рис. 7.1. Для примера рассмотрим отображение прямоугольной изометрической проекции на двумерную систему координат, соответствующую экрану дисплея (рис. 7.2). Центры систем отсчета совмещены. Ось Y двумерной системы совпадает с осью Z трехмерного пространства. Из рисунка 7.2 видно, что
Mx2 = My3 * cos30o - Mx3 * cos30o = cos30o * (My3 - Mx3) = 0.87 * (My3 - Mx3),
My2 = Mz3 - (My3 * sin30o + Mx3 * sin30o) = 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)).