home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 10 / grafik / rot3d.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-07-29  |  2.0 KB  |  63 lines

  1. (*-------------------------------------------------------------*)
  2. (*                      ROT3D.PAS                              *)
  3. (* Grafikserie: Erstellung der Transformationsmatrix, um       *)
  4. (*              Objekte um eine "schraege" Rotationsachse      *)
  5. (*              zu drehen.                                     *)
  6. (*-------------------------------------------------------------*)
  7.  
  8. PROCEDURE Rot3D(VAR Matrix : tMatrix;
  9.                 x1, y1, z1,           (* Zwei Punkte auf der *)
  10.                 x2, y2, z2 : REAL;    (* Drehachse.          *)
  11.                 Phi : REAL          );(* Drehwinkel(Grad).   *)
  12.  
  13. CONST Pi_durch_180 = 17.453292e-3;
  14.  
  15. VAR Temp, Dreh : tMatrix;
  16.     u, v, w, r, r2 : REAL;
  17.  
  18. BEGIN
  19.   Phi := Phi*Pi_durch_180;
  20.   (*--- Relativ-Vektor berechnen ---*)
  21.   u := x2 - x1;   v := y2 - y1;   w := z2 - z1;
  22.   (*--- Verschiebung in den Ursprung durchfuehren ---*)
  23.   EinheitsMatrix(Temp);
  24.   Translation(Temp,-x1,-y1,-z1);
  25.   (*--- Erste Rotation durchfuehren ---*)
  26.   r := Sqrt(v*v+w*w);
  27.   EinheitsMatrix(Dreh);
  28.   Dreh[2,2] := w/r;
  29.   Dreh[2,3] := v/r;
  30.   Dreh[3,2] := -Dreh[2,3];
  31.   Dreh[3,3] := Dreh[2,2];
  32.   MatMult(Temp,Dreh,Temp);
  33.   (*--- Zweite Rotation durchfuehren ---*)
  34.   r2 := Sqrt(u*u+r*r);
  35.   EinheitsMatrix(Dreh);
  36.   Dreh[1,1] := r/r2;
  37.   Dreh[1,3] := u/r2;
  38.   Dreh[3,1] := -Dreh[1,3];
  39.   Dreh[3,3] := Dreh[1,1];
  40.   MatMult(Temp,Dreh,Temp);
  41.   (*--- Nun die gewuenschte Rotation um die Drehachse ---*)
  42.   z_Rotation(Temp,Phi);
  43.   (*=== Ab hier wieder rueck-transformieren ===*)
  44.   (*--- Zweite Drehung rueckwärts ---*)
  45.   EinheitsMatrix(Dreh);
  46.   Dreh[1,1] := r/r2;
  47.   Dreh[1,3] := u/r2;
  48.   Dreh[3,1] := Dreh[1,3];
  49.   Dreh[3,3] := Dreh[1,1];
  50.   MatMult(Temp,Dreh,Temp);
  51.   (*--- Erste Drehung rueckwärts ---*)
  52.   EinheitsMatrix(Dreh);
  53.   Dreh[2,2] := w/r;
  54.   Dreh[2,3] := -r;
  55.   Dreh[3,2] := -Dreh[2,3];
  56.   Dreh[3,3] := Dreh[2,2];
  57.   MatMult(Temp,Dreh,Temp);
  58.   (*--- Wieder zurueck schieben ---*)
  59.   Translation(Temp,x1,y1,z1);
  60.   (*=== Endgueltige Matrix berechnen ===*)
  61.   MatMult(Matrix,Temp,Matrix);
  62. END;
  63.