home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter51 / l51-4.c < prev    next >
C/C++ Source or Header  |  1997-06-18  |  3KB  |  67 lines

  1. /* Routines to perform incremental rotations around the three axes
  2.    Tested with Borland C++ 4.02 in small model by Jim Mischel 12/16/94.
  3. */
  4. #include <math.h>
  5. #include "polygon.h"
  6.  
  7. /* Concatenate a rotation by Angle around the X axis to the transformation in 
  8. XformToChange, placing result back in XformToChange. */
  9. void AppendRotationX(double XformToChange[4][4], double Angle)
  10. {
  11.    double Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
  12.    double CosTemp = cos(Angle), SinTemp = sin(Angle);
  13.  
  14.    /* Calculate the new values of the four affected matrix entries */
  15.    Temp10 = CosTemp*XformToChange[1][0]+ -SinTemp*XformToChange[2][0];
  16.    Temp11 = CosTemp*XformToChange[1][1]+ -SinTemp*XformToChange[2][1];
  17.    Temp12 = CosTemp*XformToChange[1][2]+ -SinTemp*XformToChange[2][2];
  18.    Temp20 = SinTemp*XformToChange[1][0]+ CosTemp*XformToChange[2][0];
  19.    Temp21 = SinTemp*XformToChange[1][1]+ CosTemp*XformToChange[2][1];
  20.    Temp22 = SinTemp*XformToChange[1][2]+ CosTemp*XformToChange[2][2];
  21.    /* Put the results back into XformToChange */
  22.    XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
  23.    XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20; 
  24.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  25. }
  26.  
  27. /* Concatenate a rotation by Angle around the Y axis to the transformation in 
  28. XformToChange, placing result back in XformToChange. */
  29. void AppendRotationY(double XformToChange[4][4], double Angle)
  30. {
  31.    double Temp00, Temp01, Temp02, Temp20, Temp21, Temp22;
  32.    double CosTemp = cos(Angle), SinTemp = sin(Angle);
  33.  
  34.    /* Calculate the new values of the four affected matrix entries */
  35.    Temp00 = CosTemp*XformToChange[0][0]+ SinTemp*XformToChange[2][0];
  36.    Temp01 = CosTemp*XformToChange[0][1]+ SinTemp*XformToChange[2][1];
  37.    Temp02 = CosTemp*XformToChange[0][2]+ SinTemp*XformToChange[2][2];
  38.    Temp20 = -SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[2][0];
  39.    Temp21 = -SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[2][1];
  40.    Temp22 = -SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[2][2];
  41.    /* Put the results back into XformToChange */
  42.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  43.    XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20;
  44.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  45. }
  46.  
  47. /* Concatenate a rotation by Angle around the Z axis to the transformation in 
  48. XformToChange, placing result back in XformToChange. */
  49. void AppendRotationZ(double XformToChange[4][4], double Angle)
  50. {
  51.    double Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
  52.    double CosTemp = cos(Angle), SinTemp = sin(Angle);
  53.  
  54.    /* Calculate the new values of the four affected matrix entries */
  55.    Temp00 = CosTemp*XformToChange[0][0]+ -SinTemp*XformToChange[1][0];
  56.    Temp01 = CosTemp*XformToChange[0][1]+ -SinTemp*XformToChange[1][1];
  57.    Temp02 = CosTemp*XformToChange[0][2]+ -SinTemp*XformToChange[1][2];
  58.    Temp10 = SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[1][0];
  59.    Temp11 = SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[1][1];
  60.    Temp12 = SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[1][2];
  61.    /* Put the results back into XformToChange */
  62.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  63.    XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
  64.    XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
  65. }
  66.  
  67.