Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 40032.doc
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
203.26 Кб
Скачать

Динамическое преобразование двумерных координат

Данный вид изображений находит широкое применение в компьютерной графике для синтеза мнемосхем, моделирования технологических процессов и перемещений роботов, расширения изобразительных возможностей человеко-машинного интерфейса.

Пример программы

В локальной системе координат нарисовать две параллельные вертикальные линии. Нижняя координата левой линии находится в точке (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)).

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