Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Отображения 3-х мерных объектов на плоскости


Автор: Jeyzi 22.2.2008, 05:20
Здравствуйте прошу помочь переделать программу реализующую трехмерное преобразование с фигурой. Фигура отображенная в контурном виде без удаления невидимых линий и умеет  вращаться вокруг произвольной оси. Управление преобразованием по осям осуществляется с помощью девяти клавиш (<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 и общее масштабирование по трем осям. 
Возможно вы удивитесь, есть рабочая программа, а он не может переделать, всё очень просто, тут математику тоже знать надо, да и программу не простенькая всё таки не площадь треугольника расчитываем.
Извините за отступления помогите пожалуйста, а то сроки сдачи поджимают кто чем может!

Про теги не забываем...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)