IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> 3d графика, описание
shinkirou
сообщение 16.06.2010 9:36
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской
Реальное имя: Alex

Репутация: -  0  +


Нужно построить 3d модели на TP. Пошарил по сети, нашел этот пример.
Помогите разобраться (хоть откомментировать), а то с процедурным не оч, а сдавать скоро, копипаст не хотелось бы нести.

 Uses Graph, Crt;

Const N=8;
      M=12;

Type Coord = record
        X,Y,Z : Real;
     End;

     Rebro = record
        B,E,C : Word;
     End;

Var
  grDriver : Integer;
  grMode   : Integer;
         A : Array [1..N] of Coord;
         B : Array [1..M] of Rebro;
       Key : Char;
         I : Byte;
       L,C : Coord;
Ux, Uy, Uz : Real;

Procedure Tr3d(P,T:Coord; Var R:Coord); 
Type Matrix = Array [1..4,1..4] Of Real;
Var I,J : Byte;
      O : Matrix;
Begin
     For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1
                                                    Else O[I,J] := 0;

     O[1,4] := T.X;
     O[2,4] := T.Y;
     O[3,4] := T.Z;

     R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];
     R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];
     R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];
End;

Procedure Sr3d(P,S:Coord; Var R:Coord);
Type Matrix = Array [1..4,1..4] Of Real;
Var I,J : Byte;
      O : Matrix;
Begin
     For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1
                                                    Else O[I,J] := 0;

     O[1,1] := S.X;
     O[2,2] := S.Y;
     O[3,3] := S.Z;

     R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];
     R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];
     R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];
End;

Procedure UX3d(P:Coord; Teta:Real; Var R:Coord); 
Type Matrix = Array [1..4,1..4] Of Real;
Var I,J : Byte;
      O : Matrix;
Begin
     For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1
                                                    Else O[I,J] := 0;
     O[2,2] :=  COS(Teta);
     O[2,3] := -SIN(Teta);
     O[3,2] :=  SIN(Teta);
     O[3,3] :=  COS(Teta);

     R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];
     R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];
     R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];
End;

Procedure UY3d(P:Coord; Teta:Real; Var R:Coord); 
Type Matrix = Array [1..4,1..4] Of Real;
Var I,J : Byte;
      O : Matrix;
Begin
     For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1
                                                    Else O[I,J] := 0;
     O[1,1] :=  COS(Teta);
     O[1,3] := -SIN(Teta);
     O[3,1] :=  SIN(Teta);
     O[3,3] :=  COS(Teta);

     R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];
     R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];
     R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];
End;

Procedure UZ3d(P:Coord; Teta:Real; Var R:Coord);
Type Matrix = Array [1..4,1..4] Of Real;
Var I,J : Byte;
      O : Matrix;
Begin
     For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1
                                                    Else O[I,J] := 0;
     O[1,1] :=  COS(Teta);
     O[1,2] := -SIN(Teta);
     O[2,1] :=  SIN(Teta);
     O[2,2] :=  COS(Teta);

     R.X := O[1,1] * P.X + O[1,2] * P.Y + O[1,3] * P.Z + O[1,4];
     R.Y := O[2,1] * P.X + O[2,2] * P.Y + O[2,3] * P.Z + O[2,4];
     R.Z := O[3,1] * P.X + O[3,2] * P.Y + O[3,3] * P.Z + O[3,4];
End;

Procedure Fig;
Begin
     A[ 1].X :=  10; A[ 1].Y :=  10; A[ 1].Z :=  10;
     A[ 2].X :=  10; A[ 2].Y :=  10; A[ 2].Z := -10;
     A[ 3].X :=  10; A[ 3].Y := -10; A[ 3].Z := -10;
     A[ 4].X :=  10; A[ 4].Y := -10; A[ 4].Z :=  10;
     A[ 5].X := -10; A[ 5].Y :=  10; A[ 5].Z :=  10;
     A[ 6].X := -10; A[ 6].Y :=  10; A[ 6].Z := -10;
     A[ 7].X := -10; A[ 7].Y := -10; A[ 7].Z := -10;
     A[ 8].X := -10; A[ 8].Y := -10; A[ 8].Z :=  10;

     B[ 1].B :=   1; B[ 1].E :=   2; B[ 1].C :=   10;
     B[ 2].B :=   2; B[ 2].E :=   3; B[ 2].C :=   10;
     B[ 3].B :=   3; B[ 3].E :=   4; B[ 3].C :=   10;
     B[ 4].B :=   4; B[ 4].E :=   1; B[ 4].C :=   10;

     B[ 5].B :=   5; B[ 5].E :=   6; B[ 5].C :=   13;
     B[ 6].B :=   6; B[ 6].E :=   7; B[ 6].C :=   13;
     B[ 7].B :=   7; B[ 7].E :=   8; B[ 7].C :=   13;
     B[ 8].B :=   8; B[ 8].E :=   5; B[ 8].C :=   13;

     B[ 9].B :=   1; B[ 9].E :=   5; B[ 9].C :=   7;
     B[10].B :=   2; B[10].E :=   6; B[10].C :=   7;
     B[11].B :=   3; B[11].E :=   7; B[11].C :=   7;
     B[12].B :=   4; B[12].E :=   8; B[12].C :=   7;

End;

Procedure Draw3D;
Var I : Byte;
    XB, YB, XE, YE : Real;
Begin
     For I := 1 To M Do Begin
         SetColor(B[I].C);
         XB := A[B[I].B].X;
         YB := A[B[I].B].Y;
         XE := A[B[I].E].X;
         YE := A[B[I].E].Y;
         Line( Trunc(XB), Trunc(YB), Trunc(XE), Trunc(YE) );
     End;
End;

Procedure Hide3D;
Var I : Byte;
    XB, YB, XE, YE : Real;
Begin
     SetColor(Black);
     For I := 1 To M Do Begin
         XB := A[B[I].B].X;
         YB := A[B[I].B].Y;
         XE := A[B[I].E].X;
         YE := A[B[I].E].Y;
         Line( Trunc(XB), Trunc(YB), Trunc(XE), Trunc(YE) );
     End;
End;

Begin
     ClrScr;

     WriteLn('1-2 ‚вращение по оси OZ');
     WriteLn('3-4 ‚вращение по оси OY');
     WriteLn('5-6 ‚вращение по оси OX');
     WriteLn('7-8 приблизить\отдалить');

     ReadLn;

     Fig;

     C.X := 5; C.Y := 5; C.Z := 5;
     For I := 1 To N Do Sr3d(A[I], C, A[I]);
     L.X := 200; L.Y := 200; L.Z := 200;
     For I := 1 To N Do Tr3d(A[I], L, A[I]);

     grDriver := Detect;
     InitGraph(grDriver,grMode,'c:\tp\bgi\');

     Draw3D;

     Key := ' ';
     While Key <> #27 Do Begin
           Key := ReadKey;

           If Key = '1' Then Begin
              Hide3D;

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Uz := Pi/120; For I := 1 To N Do Uz3d(A[i],Uz,A[i]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;

           If Key = '2' Then Begin
              Hide3D;

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Uz := -Pi/120; For I := 1 To N Do Uz3d(A[i],Uz,A[i]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;

           If Key = '3' Then Begin
              Hide3D;

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Uy := Pi/120; For I := 1 To N Do Uy3d(A[i],Uy,A[i]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;

           If Key = '4' Then Begin
              Hide3D;

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Uy := -Pi/120; For I := 1 To N Do Uy3d(A[i],Uy,A[i]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;

           If Key = '5' Then Begin
              Hide3D;

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Ux := Pi/120; For I := 1 To N Do Ux3d(A[i],Ux,A[i]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;

           If Key = '6' Then Begin
              Hide3D;

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Ux := -Pi/120; For I := 1 To N Do Ux3d(A[i],Ux,A[i]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;

           If Key = '7' Then Begin
              Hide3D;
              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              C.X := 1.1; C.Y := 1.1; C.Z := 1.1;
              For I := 1 To N Do Sr3d(A[I], C, A[I]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);
              Draw3D;
           End;

           If Key = '8' Then Begin
              Hide3D;
              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              C.X := 0.9; C.Y := 0.9; C.Z := 0.9;
              For I := 1 To N Do Sr3d(A[I], C, A[I]);

              L.X := -L.X; L.Y := -L.Y; L.Z := -L.Z;
              For I := 1 To N Do Tr3d(A[I], L, A[I]);

              Draw3D;
           End;
     End;
     Hide3D;

     CloseGraph;

End.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 

- Текстовая версия 27.07.2025 13:10
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"