IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Переделать программу, Тетраэдр
Эндрю
сообщение 22.2.2008, 2:54
Сообщение #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
сообщение 22.2.2008, 19:26
Сообщение #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;
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 30.4.2024, 11:37

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru