![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Эндрю |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 1 Регистрация: 22.2.2008 Город: Тула ![]() |
Здравствуйте прошу помочь переделать программу реализующую трехмерное преобразование с фигурой. Фигура отображенна в контурном виде без удаления невидимых линий и умеет вращаться вокруг произвольной оси. Управление преобразованием по осям осуществляется с помощью девяти клавиш (<1>…<9>) на цифровой клавиатуре.
Фигура - параллелепипед. Преобразование – отражение одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOY и YOZ PROGRAM Paralel; USES Crt, Graph; VAR Gd, Gm: Integer; {Переменные для работы в графическом режиме} par: array[1..8, 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; {==============================} PROCEDURE Otr_XOZ_YOZ; {Отражение относительно плоскостей XOZ и YOZ} BEGIN For i:=1 To 8 Do Begin par[i,2]:=-par[i,2]; par[i,1]:=-par[i,1]; End; END; {==============================} PROCEDURE Otr_XOZ_XOY; {Отражение относительно плоскостей XOZ и XOY} BEGIN For i:=1 To 8 Do Begin par[i,2]:=-par[i,2]; par[i,3]:=-par[i,3]; End; END; {==============================} PROCEDURE Otr_XOY_YOZ; {Отражение относительно плоскостей XOY и YOZ} BEGIN For i:=1 To 8 Do Begin par[i,3]:=-par[i,3]; par[i,1]:=-par[i,1]; End; END; {==============================} PROCEDURE VrachOX(Ugol: real); {Поворот вокруг оси OX} VAR y,z: real; BEGIN For i:=1 To 8 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; {==============================} PROCEDURE VrachOY(Ugol: real); {Поворот вокруг оси OY} VAR x,z: real; BEGIN For i:=1 To 8 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; {==============================} PROCEDURE VrachOZ(Ugol: real); {Поворот вокруг оси OZ} VAR x,y: real; BEGIN For i:=1 To 8 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]:=0; par[2,2]:=110; par[2,3]:=0; par[3,1]:=175; par[3,2]:=110; par[3,3]:=0; par[4,1]:=175; par[4,2]:=0; par[4,3]:=0; par[5,1]:=0; par[5,2]:=0; par[5,3]:=150; par[6,1]:=0; par[6,2]:=110; par[6,3]:=150; par[7,1]:=175; par[7,2]:=110; par[7,3]:=150; par[8,1]:=175; par[8,2]:=0; par[8,3]:=150; {и ребра} rebra[1,1]:=1; rebra[1,2]:=2; rebra[2,1]:=2; rebra[2,2]:=3; rebra[3,1]:=3; rebra[3,2]:=4; rebra[4,1]:=4; rebra[4,2]:=1; rebra[5,1]:=5; rebra[5,2]:=6; rebra[6,1]:=6; rebra[6,2]:=7; rebra[7,1]:=7; rebra[7,2]:=8; rebra[8,1]:=8; rebra[8,2]:=5; rebra[9,1]:=1; rebra[9,2]:=5; rebra[10,1]:=2; rebra[10,2]:=6; rebra[11,1]:=3; rebra[11,2]:=7; rebra[12,1]:=4; rebra[12,2]:=8; Gd := Detect; InitGraph(Gd, Gm, ''); {Инициализация графического режима} If GraphResult <> grOk Then Halt(1); SetBkColor(Blue); {Устанавливаем цвет фона} 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. В моем же случае нужно чтобы была Фигура - Тетраэдр. А преобразование – Изменение масштаба по осям X,Y,Z и общее масштабирование по трем осям. |
![]() ![]() |
creer |
![]()
Сообщение
#2
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Так. Для начала вспомним что такое тетраэдр, это многогранник с четырьмя треугольными гранями, в каждой из вершин которого сходятся по 3 грани. То есть рисуем 4 точки и соединяем все грани ребрами, итого 6 ребер.
То есть пишем что-то вроде {Описываем фигуру} par[1,1]:=0; par[1,2]:=0; par[1,3]:=0; par[2,1]:=0; par[2,2]:=110; par[2,3]:=0; par[3,1]:=0; par[3,2]:=0; par[3,3]:=110; par[4,1]:=110; par[4,2]:=0; par[4,3]:=0; {и ребра} rebra[1,1]:=1; rebra[1,2]:=2; rebra[2,1]:=2; rebra[2,2]:=3; rebra[3,1]:=3; rebra[3,2]:=1; rebra[4,1]:=4; rebra[4,2]:=1; rebra[5,1]:=4; rebra[5,2]:=2; rebra[6,1]:=4; rebra[6,2]:=3; После определяем процедуры маштабирования, например уменьшение масштаба по 1 координате можно написать как PROCEDURE ZoomOutX; BEGIN For i:=1 To 4 Do Begin //4 вершины, 0.8<1 -> уменьшение par[i,1]:=0.8*par[i,1]; End; END; |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 23:10 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru