home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter52 / l52-3.c < prev    next >
C/C++ Source or Header  |  1997-06-18  |  4KB  |  88 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.  
  5. #include <math.h>
  6. #include "polygon.h"
  7.  
  8. /* Concatenate a rotation by Angle around the X axis to transformation in 
  9.  XformToChange, placing the result back into XformToChange. */
  10. void AppendRotationX(Xform XformToChange, double Angle)
  11. {
  12.    Fixedpoint Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
  13.    Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle));
  14.    Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle));
  15.  
  16.    /* Calculate the new values of the six affected matrix entries */
  17.    Temp10 = FixedMul(CosTemp, XformToChange[1][0]) +
  18.          FixedMul(-SinTemp, XformToChange[2][0]);
  19.    Temp11 = FixedMul(CosTemp, XformToChange[1][1]) +
  20.          FixedMul(-SinTemp, XformToChange[2][1]);
  21.    Temp12 = FixedMul(CosTemp, XformToChange[1][2]) +
  22.          FixedMul(-SinTemp, XformToChange[2][2]);
  23.    Temp20 = FixedMul(SinTemp, XformToChange[1][0]) +
  24.          FixedMul(CosTemp, XformToChange[2][0]);
  25.    Temp21 = FixedMul(SinTemp, XformToChange[1][1]) +
  26.          FixedMul(CosTemp, XformToChange[2][1]);
  27.    Temp22 = FixedMul(SinTemp, XformToChange[1][2]) +
  28.          FixedMul(CosTemp, XformToChange[2][2]);
  29.    /* Put the results back into XformToChange */
  30.    XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
  31.    XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20; 
  32.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  33. }
  34. /* Concatenate a rotation by Angle around the Y axis to transformation in 
  35.   XformToChange, placing the result back into XformToChange. */
  36. void AppendRotationY(Xform XformToChange, double Angle)
  37. {
  38.    Fixedpoint Temp00, Temp01, Temp02, Temp20, Temp21, Temp22;
  39.    Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle));
  40.    Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle));
  41.  
  42.    /* Calculate the new values of the six affected matrix entries */
  43.    Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
  44.          FixedMul(SinTemp, XformToChange[2][0]);
  45.    Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
  46.          FixedMul(SinTemp, XformToChange[2][1]);
  47.    Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
  48.          FixedMul(SinTemp, XformToChange[2][2]);
  49.    Temp20 = FixedMul(-SinTemp, XformToChange[0][0]) +
  50.          FixedMul( CosTemp, XformToChange[2][0]);
  51.    Temp21 = FixedMul(-SinTemp, XformToChange[0][1]) +
  52.          FixedMul(CosTemp, XformToChange[2][1]);
  53.    Temp22 = FixedMul(-SinTemp, XformToChange[0][2]) +
  54.          FixedMul(CosTemp, XformToChange[2][2]);
  55.    /* Put the results back into XformToChange */
  56.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  57.    XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20;
  58.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  59. }
  60.  
  61. /* Concatenate a rotation by Angle around the Z axis to transformation in 
  62.   XformToChange, placing the result back into XformToChange. */
  63. void AppendRotationZ(Xform XformToChange, double Angle)
  64. {
  65.    Fixedpoint Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
  66.    Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle));
  67.    Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle));
  68.  
  69.    /* Calculate the new values of the six affected matrix entries */
  70.    Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
  71.          FixedMul(-SinTemp, XformToChange[1][0]);
  72.    Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
  73.          FixedMul(-SinTemp, XformToChange[1][1]);
  74.    Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
  75.          FixedMul(-SinTemp, XformToChange[1][2]);
  76.    Temp10 = FixedMul(SinTemp, XformToChange[0][0]) +
  77.          FixedMul(CosTemp, XformToChange[1][0]);
  78.    Temp11 = FixedMul(SinTemp, XformToChange[0][1]) +
  79.          FixedMul(CosTemp, XformToChange[1][1]);
  80.    Temp12 = FixedMul(SinTemp, XformToChange[0][2]) +
  81.          FixedMul(CosTemp, XformToChange[1][2]);
  82.    /* Put the results back into XformToChange */
  83.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  84.    XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
  85.    XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
  86. }
  87.  
  88.