Полная версия

Главная arrow Информатика arrow Компьютерная Графика arrow
Трехмерные преобразования

  • Увеличить шрифт
  • Уменьшить шрифт


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


Трехмерные преобразования.

Цель работы:

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

Постановка задачи:

Составить программу, реализующую трехмерное преобра­зование с фигурой (см. табл.). Для всех вариантов фигура долж­на отображаться в контурном виде без удаления невидимых ли­ний и уметь вращаться вокруг произвольной оси. Управление преобразованием по осям осуществлять с помощью девяти клавиш (<1>...<9>) на цифровой клавиатуре.

Вариант №

Фигура

Преобразование

10

Октаэдр

Отражение одновременно относительно плоскостей XOZ и YOZ, XOZ иXOY, XOYи YOZ.

Описание метода решения задачи:

Октаэдр состоит из 6 вершин и 12 ребер.

Для реализации данной задачи нам необходимо создать массив с координатами вершин и массив ребер октаэдра.

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

Поворот вокруг оси x на угол ?:

Поворот вокруг оси y на угол ?:

Поворот вокруг оси z на угол ?:

Отображение относительно плоскости XOYменяет лишь знакZ-координаты точек. Таким образом,

Отображение относительно:

XOY XOZYOZ

Для поворота фигуры октаэдра используются клавиши <1>-<6>, клавиши <7>-<9> - отражение относительно плоскостей XOZ и YOZ, XOZ и XOY, XOYиYOZ.

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

PROGRAM kg10;

USES Crt, Graph;

VAR Gd, Gm: Integer; {Переменные для работы в графическом режиме}

par: array[1..6, 1..3] of real; {Массив с координатами вершин}

rebra: array[1..12, 1..2] of integer; {Массив ребер}

i: integer; {Переменная для работы цикла}

ch: char; {Значение нажатой клавиши}

{Процедура вывода на экран}

PROCEDURE Draw;

VAR x1,x2,y1,y2: integer;

ver1, ver2: integer;

BEGIN

For i:=1 To 12 Do Begin {Рисуем 12 ребер}

ver1:=rebra[i,1]; {Координата вершины, соединяемая i-м ребром}

ver2:=rebra[i,2]; {Координата вершины, соединяемая i-м ребром}

x1:=round(par[ver1,1])+320;

y1:=240-round(par[ver1,2]);

x2:=round(par[ver2,1])+320;

y2:=240-round(par[ver2,2]);

line(x1,y1,x2,y2); {Выводим очередное ребро}

End;

END;

{Процедура отражения относительно плоскостей XOZ и YOZ}

PROCEDURE Otr_XOZ_YOZ;

BEGIN

For i:=1 To 6 Do Begin

par[i,2]:=-par[i,2];

par[i,1]:=-par[i,1];

End;

END;

{Процедура отражения относительно плоскостей XOZ и XOY}

PROCEDURE Otr_XOZ_XOY;

BEGIN

For i:=1 To 6 Do Begin

par[i,2]:=-par[i,2];

par[i,3]:=-par[i,3];

End;

END;

{Процедура отражения относительно плоскостей XOY и YOZ}

PROCEDURE Otr_XOY_YOZ;

BEGIN

For i:=1 To 6 Do Begin

par[i,3]:=-par[i,3];

par[i,1]:=-par[i,1];

End;

END;

{Процедура поворота вокруг оси OX}

PROCEDURE VrachOX(Ugol: real);

VAR y,z: real;

BEGIN

For i:=1 To 6 Do Begin

y:=par[i,2];

z:=par[i,3];

par[i,2]:=y*cos(Ugol)-z*sin(Ugol);

par[i,3]:=y*sin(Ugol)+z*cos(Ugol);

End;

End;

{Процедура поворота вокруг оси OY}

PROCEDURE VrachOY(Ugol: real);

VAR x,z: real;

BEGIN

For i:=1 To 6 Do Begin

x:=par[i,1];

z:=par[i,3];

par[i,1]:=x*cos(Ugol)+z*sin(Ugol);

par[i,3]:=-x*sin(Ugol)+z*cos(Ugol);

End;

END;

{Процедура поворота вокруг оси OZ}

PROCEDURE VrachOZ(Ugol: real);

VAR x,y: real;

BEGIN

For i:=1 To 6 Do Begin

x:=par[i,1];

y:=par[i,2];

par[i,1]:=x*cos(Ugol)-y*sin(Ugol);

par[i,2]:=x*sin(Ugol)+y*cos(Ugol);

End;

END;

BEGIN

{Описываем фигуру}

par[1,1]:=0; par[1,2]:=0; par[1,3]:=0;

par[2,1]:=110; par[2,2]:=0; par[2,3]:=0;

par[3,1]:=55; par[3,2]:=0; par[3,3]:=-55;

par[4,1]:=55; par[4,2]:=0; par[4,3]:=55;

par[5,1]:=55; par[5,2]:=110; par[5,3]:=27.5;

par[6,1]:=55; par[6,2]:=-110; par[6,3]:=27.5;

{Описываем ребра}

rebra[1,1]:=1; rebra[1,2]:=3;

rebra[2,1]:=3; rebra[2,2]:=2;

rebra[3,1]:=2; rebra[3,2]:=4;

rebra[4,1]:=4; rebra[4,2]:=1;

rebra[5,1]:=1; rebra[5,2]:=5;

rebra[6,1]:=1; rebra[6,2]:=6;

rebra[7,1]:=2; rebra[7,2]:=5;

rebra[8,1]:=2; rebra[8,2]:=6;

rebra[9,1]:=3; rebra[9,2]:=5;

rebra[10,1]:=3; rebra[10,2]:=6;

rebra[11,1]:=4; rebra[11,2]:=5;

rebra[12,1]:=4; rebra[12,2]:=6;

Gd := Detect;

InitGraph(Gd, Gm, ''); {Инициализация графического режима}

If GraphResult <> grOk Then

Halt(1);

SetBkColor(Black); {Устанавливаем цвет фона}

ClearDevice; {Очищаем экран}

VrachOX(pi/12);

VrachOY(pi/12);

VrachOZ(pi/12);

While ch<>#27 Do Begin {Пока не нажата клавиша "Esc"}

ClearDevice; {Очищаем экран}

Draw; {Выводим}

OuttextXY(10,450,'Press <1>-<6> for rotation, <7>-<9> for reflection');

OuttextXY(10,465,'Press <Esc> to Exit');

ch:=readkey; {Считываем значение нажатой клавиши}

Case ch Of

'1': VrachOX(pi/15); {Вращение вокруг оси OX}

'4': VrachOX(-pi/15);

'2': VrachOY(pi/15); {Вращение вокруг оси OY}

'5': VrachOY(-pi/15);

'3': VrachOZ(pi/15); {Вращение вокруг оси OZ}

'6': VrachOZ(-pi/15);

'7': Otr_XOZ_YOZ; {Отражение относительно плоскостей XOZ и YOZ}

'8': Otr_XOZ_XOY; {Отражение относительно плоскостей XOZ и XOY}

'9': Otr_XOY_YOZ; {Отражение относительно плоскостей XOY и YOZ}

End;

End;

CloseGraph; {Завершение работы в графическом режиме}

END.

Заключение:

В данной работе демонстрируется трехмерное преобразование октаэдра. Отражение одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOYиYOZ.

Фигура отображается в контурном виде без удаления невидимых линий и умеет вращаться вокруг произвольной оси.

В результате проделанной работы были освоены методы построения геометрических изображений в трехмерной графике.

Список литературы:

  1. «Компьютерная графика», А. А. Шелестов, учебное пособие, Томск, 2001 г.

 

Похожие темы