Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lrgraph

.pdf
Скачиваний:
12
Добавлен:
11.03.2016
Размер:
749.88 Кб
Скачать

51

24)сдвиг до точки (160, -30) с поворотом по часовой стрелке на 1о на каждом шаге;

25)сдвиг до точки (-140, 30) с поворотом по часовой стрелке на каждом шаге на 1о;

26)сдвиг до точки (-70, -80) с увеличением к концу движения фигуры в 2 раза;

Выполнение лабораторной работы

1.Получить задание у преподавателя.

2.Написать и отладить на компьютере программу, реализующую требуемое преобра-

зование изображения без масштабирования.

3.Если изображение искажено, ввести масштабирующие коэффициенты.

4.Результат работы программы продемонстрировать преподавателю.

5.Напечатать листинг программы.

Содержание отчета

Отчет включает:

1)содержание задания;

2)блок-схему программы;

3)листинг программы.

Контрольные вопросы

1. Можно ли получить динамическое изображение на основе одной графической стра-

ницы?

2.Можно ли совместить при движении три вида преобразования: сдвиг, поворот и масштабирование?

3.Чему равен минимальный дискрет перемещения изображения по осям X и Y?

4.Чем определяется скорость перемещения изображения по экрану?

5.Какие варианты задания допускают однократное построение координатных осей?

52

Рекомендуемая литература

Смотри литературу, рекомендованную к лабораторной работе №5.

53

Лабораторная работа №7

Трехмерные преобразования координат

Цель работы: исследование математических методов и алгоритмов преобразования трехмерных координат в процессе построения сложных графических изображений на плос-

кости.

Введение

Большинство геометрических преобразований, с которыми сталкивается инженер в практической деятельности, реализуется в трехмерном пространстве (движение робота с захватом объекта, изображение объемной детали и т.д.). Существует ряд нелинейных трехмерных систем отсчета: цилиндрические, сферические и др. /1/, но наиболее часто используются аффинные преобразования, так как они не меняют форму тел. Общая структура уравнений, используемых в процессе таких преобразований, та же, что и при двух координатах, но теперь уравнений три

x2 = axxx1 + axyy1 + axzz1 + ax, y2 = ayxx1 + ayyy1 + ayzz1 + ay, z2 = azxx1 + azyy1 + azzz1 + az,

При этом 9-членная квадратная матрица используется для реализации поворота точки вокруг осей, а 3-членный вектор осуществляет ее перенос в трехмерном пространстве. В отличие от поворота на плоскости в пространстве поворот задается последовательным вращением вокруг трех координатных осей. При этом для каждой оси существует своя матри-ца поворота /2/. Поворот на угол Θ относительно оси z осуществляется матрицей

 

cosΘ

-sinΘ

0

Rz =

sinΘ

cosΘ

0

 

0

0

1

 

 

 

 

Аналогично выполняется поворот на угол Θ относительно оси y

 

cosΘ

0

sinΘ

Ry =

0

1

0

 

 

 

 

54

 

 

 

 

 

-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)).

Описание среды программирования

Для упрощения процесса реализации программы предлагается использовать видеоре-

жим с разрешением 640х480, что устраняет необходимость в масштабировании конечного

55

изображения на экране, позволяя сосредоточить основное внимание на процедуре преобразо-

вания трехмерных кооординат на плоскость.

 

Z

 

 

 

Z

 

90о

 

 

 

90о

 

 

 

 

7o10'

 

 

0

 

 

 

 

 

30o

 

X

0

41o 25'

X

120o

Y

 

 

Y

Прямоугольная изометрическая

 

Прямоугольная диметрическая

проекция; U = V = W = 0.82

 

проекция; U = W = 0.94, V = 0.47

 

Z

 

 

 

Z

 

90o

90o

 

X

0

0

 

 

 

30o

 

 

45 o

 

 

 

 

90o

Y

 

Y

X

 

Косоугольная фронтальная

Косоугольная горизонтальная

 

изометрическая проекция;

изометрическая проекция

 

U = V = W = 1

U = W = V = 1

 

Z

 

 

90o

X

0

 

 

45 o

Косоугольная фронтальная

 

 

диметрическая проекция;

 

 

U = W = 1, V = 0.5

 

Y

 

56

Рис. 7.1

Z3 (Y2)

Mz3

M

My2

Mx2 0

X2

My3 30o

Mx3

X3

Y3

Рис. 7.2

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

В прямоугольной изометрической проекции нарисовать две параллельные линии, ле-

жащие на плоскости XY, а затем повернуть их на 90о против часовой стрелки вокруг осей X и Y, сдвинув на 150 пикселей изображение по оси Z и на 100 пикселей по оси Y. Фрагмент про-

граммы, реализующий построение локальной системы координат, выделен в отдельную про-

цедуру. Рекомендуется фиксировать положение линий после каждого выполненного преобра-

зования, что упрощает процесс отладки программы.

Листинг программы

Program Linii3;

uses

Graph, Crt; var

57

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; {модифицированные координаты после поворота вокруг оси Y}

x11x, x12x, x21x, x22x, y11x, y12x, y21x, y22x, z11x, z12x, z21x, z22x:real; {модифициро-

ванные координаты после поворота вокруг оси X}

x11m, x12m, x21m, x22m, y11m, y12m, y21m, y22m, z11m, z12m, z21m, z22m:real; {моди-

фицированные координаты после сдвига по осям}

dx, dy:integer; {сдвиг локальных координат относительно глобальных}

sy, sz:real; {сдвиг изображения по осям Y и Z в локальной системе координат} ax, ay:real; {углы поворота вокруг осей X и Y соответственно}

procedure XYZ(xn, yn:integer); {процедура построения трехмерной координатной системы на экране}

begin SetLineStyle(0,0,1);

Line(xn, yn, xn, 5); {вычерчивание оси Z}

Line(xn, 5, xn-5, 15);

Line(xn, 5, xn+5, 15);

Line(xn, yn, 60, yn+Round((dx-60)*0.5774)); {вычерчивание оси X} Line(60, yn+Round((dx-60)*0.5774), 64, yn+Round((dx-60)*0.5774)-10); Line(60, yn+Round((dx-60)*0.5774), 71, yn+Round((dx-60)*0.5774)); Line(xn, yn, 580, yn+Round((580-dx)*0.5774)); {вычерчивание оси Y} 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); ); {установка стиля выравнивание текста}

58

SetTextStyle(0, 0, 1); {установка стиля текста}

OutTextXY(45, yn+Round((dx-60)*0.5774), 'X'); {вывод заголовка оси X} OutTextXY(590, yn+Round((580-dx)*0.5774), 'Y'); {вывод заголовка оси Y OutTextXY(xn-15, 15, 'Z'); {вывод заголовка оси 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.71*(y11p-x11p)), dy+Round(0.82*(-z11p+0.5*(x11p+ y11p))), dx+Round(0.71*(y12p-x12p)), dy+Round(0.82*(-z12p+0.5* (x12p+y12p))));

SetColor(10); {установка цвета вычерчивания второй линии}

Line(dx+Round(0.71*(y21p-x21p)), dy+Round(0.82*(-z21p+0.5*(x21p+ y21p))), dx+Round(0.71*(y22p-x22p)), dy+Round(0.82*(-z22p+0.5* (x22p+y22p))));

end;

begin GraphDriver:=Detect;

InitGraph(GraphDriver, GraphMode, '');

SetBkColor(9); {установка светло-синего цвета фона}

ClearDevice; {закрашивание экрана цветом фона}

dx:=320; {задание величин сдвига локальной системы координат относительно глобаль-

ной}

dy:=250;

XYZ(dx, dy); {вычерчивание трехмерной системы координат на экране} x11:=0; {задание координат концевых точек линий}

y11:=0;

z11:=0;

59

x12:=0;

y12:=100;

z12:=0;

x21:=50;

y21:=0;

z21:=0;

x22:=50;

y22:=100;

z22:=0;

Linii(x11, x12, y11, y12, z11, z12, x21, x22, y21, y22, z21, z22); {вычерчивание линий в ис-

ходном состоянии}

Readln; {задержка изображения до нажатия клавиши Enter} ay:=1.57; {задание угла поворота изображения вокруг оси Y} ax:=1.57; {задание угла поворота изображения вокруг оси X} sy:=100; {задание сдвига по оси Y}

sz:=150; {задание сдвига по оси Z}

{вычисление координат изображения, повернутого вокруг оси Y} x11y:=x11*cos(ay)+z11*sin(ay);

y11y:=y11; z11y:=-x11*sin(ay)+z11*cos(ay); x12y:=x12*cos(ay)+z12*sin(ay); y12y:=y12; z12y:=-x12*sin(ay)+z12*cos(ay); x21y:=x21*cos(ay)+z21*sin(ay); y21y:=y21; z21y:=-x21*sin(ay)+z21*cos(ay); x22y:=x22*cos(ay)+z22*sin(ay); y22y:=y22; z22y:=-x22*sin(ay)+z22*cos(ay);

60

Linii(x11y, x12y, y11y, y12y, z11y, z12y, x21y, x22y, y21y, y22y, z21y, z22y); {отображение линий, повернутых вокруг оси Y на 900}

Readln;

{вычисление координат изображения, повернутого вокруг оси X} x11x:=x11y;

y11x:=y11y*cos(ax)-z11y*sin(ax); z11x:=y11y*sin(ax)+z11y*cos(ax); x12x:=x12y; y12x:=y12y*cos(ax)-z12y*sin(ax); z12x:=y12y*sin(ax)+z12y*cos(ax); x21x:=x21y; y21x:=y21y*cos(ax)-z21y*sin(ax); z21x:=y21y*sin(ax)+z21y*cos(ax); x22x:=x22y; y22x:=y22y*cos(ax)-z22y*sin(ax); z22x:=y22y*sin(ax)+z22y*cos(ax);

Linii(x11x, x12x, y11x, y12x, z11x, z12x, x21x, x22x, y21x, y22x, z21x, z22x); {отображение линий, повернутых вокруг оси X на 900}

Readln;

x11m:=x11x;

x12m:=x12x;

x21m:=x21x;

x22m:=x22x;

{вычисление координат изображения, cдвинутого по оси Y}

y11m:=y11x+sy;

y12m:=y12x+sy;

y21m:=y21x+sy;

y22m:=y22x+sy;

{вычисление координат изображения, сдвинутого по оси Z}

z11m:=z11x+sz;

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