Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2009, 09:56   #1
Yuri86
 
Регистрация: 06.10.2009
Сообщений: 7
По умолчанию Трехмерные преобразования (Turbo Pascal)

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


Есть исходник для фигуры параллелепипед, преобразование: отражение одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOY и YOZ.
Yuri86 вне форума Ответить с цитированием
Старый 07.10.2009, 09:57   #2
Yuri86
 
Регистрация: 06.10.2009
Сообщений: 7
По умолчанию Додекаэдр

Код:
Program Parallelepiped; {Программа "Параллелепипед"}

uses Crt, Graph;(*Загрузка необходмсых модулей*)


var (*Рездел описания переменных*) 
   gd, gm: Integer;
(*перменные, отвечающие за работу в граф. режиме*)   
   par: array[1..8, 1..3] of real;
(*координаты вершин*) 
   ribs: 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 := ribs[i,1];
{координата вершины, соединяемая i-м ребром}        
   ver2 := ribs[i,2];
{rоордината вершины, соединяемая 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 reflection_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 reflection_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 reflection_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 turnOX(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(corner);
       par[i,3]:=y*sin(corner)+z*cos(corner);
   end;
end;

procedure turnOY(corner: 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(corner)+z*sin(corner);
       par[i,3]:=-x*sin(corner)+z*cos(corner);
   end;
end;

procedure turnOZ(corner: 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(corner)-y*sin(corner);
       par[i,2]:=x*sin(corner)+y*cos(corner);
   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;
   
   ribs[1,1]:=1;   ribs[1,2]:=2;
   ribs[2,1]:=2;   ribs[2,2]:=3;
   ribs[3,1]:=3;   ribs[3,2]:=4;
   ribs[4,1]:=4;   ribs[4,2]:=1;
   ribs[5,1]:=5;   ribs[5,2]:=6;
   ribs[6,1]:=6;   ribs[6,2]:=7;
   ribs[7,1]:=7;   ribs[7,2]:=8;
   ribs[8,1]:=8;   ribs[8,2]:=5;
   ribs[9,1]:=1;   ribs[9,2]:=5;
   ribs[10,1]:=2;  ribs[10,2]:=6;
   ribs[11,1]:=3;  ribs[11,2]:=7;
   ribs[12,1]:=4;  ribs[12,2]:=8;

   gd := detect;
   InitGraph(gd, gm, '');
{граф. режим}      
   If GraphResult <> grOk then
      Halt(1);

   SetBkColor(Wiate);
{цвет фона}            
   ClearDevice;
{очиска экрана}               
   turnOX(pi/12);
   turnOY(pi/12);
   turnOZ(pi/12);
   While ch<>#27 do begin      
      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': turnOX(pi/15); {вращение вокруг оси OX}
         '4': turnOX(-pi/15);{вращение вокруг оси OX}
         '2': turnOY(pi/15); {вращение вокруг оси OY}
         '5': turnOY(-pi/15);{вращение вокруг оси OY}
         '3': turnOZ(pi/15); {вращение вокруг оси OZ}  
         '6': turnOZ(-pi/15);{вращение вокруг оси OZ}
         '7': reflection_XOZ_YOZ;{отабражение относительно плоскостей XOZ и YOZ} 
         '8': reflection_XOZ_XOY;{отабражение относительно плоскостей XOZ и XOY}      
         '9': reflection_XOY_YOZ; {отабражение относительно плоскостей XOY и XOZ}     
      end;
   end;
   closegraph; {Закрытие граф. режима}                  
END. {конец программы}
Нужно переделать его для фигуры додекаэдр.
Yuri86 вне форума Ответить с цитированием
Старый 07.10.2009, 10:04   #3
Yuri86
 
Регистрация: 06.10.2009
Сообщений: 7
По умолчанию Икосаэдр

Задание 2: Написать программу для изображения многогранника, вращающегося вокруг оси OY. Ось вращения не должна совпадать с собственной вертикальной осью фигуры.

Есть исходник для фигуры "гексаэдр", проекция: изомерия.

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

Последний раз редактировалось Yuri86; 07.10.2009 в 10:08.
Yuri86 вне форума Ответить с цитированием
Старый 07.10.2009, 10:05   #4
Yuri86
 
Регистрация: 06.10.2009
Сообщений: 7
По умолчанию

Код:
PROGRAM Gegsaedr;
Uses Crt, Graph; {загрузка необходымых модулей}
Var gd, gm: integer;   {gеременные необходимые для работы в графическом режиме}
    hex: array[1..8, 1..3] of real; {массив с координатами вершин}
    hex2: array[1..8, 1..2] of integer; {массив с координатами вершин в проекции}
    verges: array[1..6, 1..4] of integer; {массив граней гексаэдра}
    i, j: integer;     {переменные цикла}
    ch: char;          {Значение нажатой клавиши}

Procedure projection;           {расчет координат проекции}
Const CornerX=35.26*Pi/180;       {угол вращения вокруг оси X}
      CornerY=45*Pi/180;          {угол вращения вокруг оси Y}
begin
   For i:=1 To 8 do begin
       hex2[i,1]:=round(hex[i,1]*cos(CornerY)+hex[i,3]*sin(CornerY))+320;
       hex2[i,2]:=290-round(hex[i,1]*sin(CornerY)*sin(CornerX)+hex[i,2]*cos(CornerX)-hex[i,3]*cos(CornerY)*sin(CornerX));
   End;
END;

Function Visibleverge(i:integer): boolean; {определение видимости i-й грани}
Var V1,V2,N: array[1..3] of real;
    scalar: real;
Begin
  {расчет значений 2-х векторов, лежащих в плоскости грани}
   for j:=1 to 3 do begin
       V1[j]:=hex[verges[i,2],j]-hex[verges[i,1],j];
       V2[j]:=hex[verges[i,3],j]-hex[verges[i,1],j];
   End;
   {вычисление вектора нормали грани}
   N[1]:=V1[2]*V2[3]-V2[2]*V1[3];
   N[2]:=V1[3]*V2[1]-V2[3]*V1[1];
   N[3]:=V1[1]*V2[2]-V2[1]*V1[2];
   {определение видимости грани}
   scalar:=N[1]-N[2]-N[3];
   If scalar>0 then
      Visibleverge:=true
   else
     Visibleverge:=false;
END;

Procedure Draw;                 {вывод на экран}
Var gran: array[1..4] of PointType;
begin
  projection;
  For i:=1 To 6 do begin
      If Visibleverge(i) then begin  {если грань видима, то программа выводит ее на экран}
         for j:=1 to 4 do begin
             verges[j].x:=hex2[verges[i,j],1];
             verges[j].y:=hex2[verges[i,j],2];
         end;
         SetFillStyle(1,i+8);   {установка цвет и стиль}
         FillPoly(4,gran);
      end;
  End;
END;

Procedure turnOY(Corner: real);  {поворот вокруг оси OY}
Var x,z: real;
Begin
   For i:=1 To 8 do begin
       x:=hex[i,1];
       z:=hex[i,3];
       hex[i,1]:=x*cos(Corner)+z*sin(Corner);
       hex[i,3]:=-x*sin(Corner)+z*cos(Corner);
   end;
END;

Begin
   {описание фигуры}
   hex[1,1]:=30;   hex[1,2]:=0;    hex[1,3]:=0;
   hex[2,1]:=30;   hex[2,2]:=150;  hex[2,3]:=0;
   hex[3,1]:=180;  hex[3,2]:=150;  hex[3,3]:=0;
   hex[4,1]:=180;  hex[4,2]:=0;    hex[4,3]:=0;
   hex[5,1]:=30;   hex[5,2]:=0;    hex[5,3]:=150;
   hex[6,1]:=30;   hex[6,2]:=150;  hex[6,3]:=150;
   hex[7,1]:=180;  hex[7,2]:=150;  hex[7,3]:=150;
   hex[8,1]:=180;  hex[8,2]:=0;    hex[8,3]:=150;
   {граний}
   verges[1,1]:=1; verges[1,2]:=2; verges[1,3]:=3; verges[1,4]:=4;
   verges[2,1]:=5; verges[2,2]:=6; verges[2,3]:=2; verges[2,4]:=1;
   verges[3,1]:=2; verges[3,2]:=6; verges[3,3]:=7; verges[3,4]:=3;
   verges[4,1]:=4; verges[4,2]:=3; verges[4,3]:=7; verges[4,4]:=8;
   verges[5,1]:=1; verges[5,2]:=4; verges[5,3]:=8; verges[5,4]:=5;
   verges[6,1]:=5; verges[6,2]:=8; verges[6,3]:=7; verges[6,4]:=6;

   gd := detect;
   InitGraph(gd, gm, '');       {инициализация графического режима}
   If GraphResult <> grOk Then
      Halt(1);

   SetBkColor(Magenta);            {устанавливает цвет фона}
   ClearDevice;                 {очистка экрана}
   Draw;                        {вывод}
   while ch<>#27 do begin       {пока не нажата клавиша "Esc", вращает}
      If keypressed then
         ch:=readkey;           {считывает значение нажатой клавиши}
      turnOY(pi/40);           {поворот вокруг оси OY}
      ClearDevice;              {очистка экран}
      Draw;{вывод}
      OuttextXY(10,465,'Press <Esc> to Exit');
      Delay(8000);
   End;
   CloseGraph;{завершение работы прогрммы в графическом режиме}
END. {конец программы}
Нужно переделать его для фигуры "икосаэдр"
Yuri86 вне форума Ответить с цитированием
Старый 08.10.2009, 01:05   #5
WWWcurious
Новичок
Джуниор
 
Регистрация: 08.10.2009
Сообщений: 1
По умолчанию

Мне кажется тебе это поможет, там как раз то, что ты ищешь, правда за символическую плату. Но есть и бесплатные исходники похожих программ.

Трехмерные преобразования: http://kinglogic.ru/content/view/39/92/

Проекции: http://kinglogic.ru/content/view/40/92/
WWWcurious вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
трехмерные фигуры и их преобразования. Klyan Паскаль, Turbo Pascal, PascalABC.NET 1 30.04.2009 18:42
Преобразования Pascal в Delphi non1ka Помощь студентам 21 05.06.2008 12:54