home *** CD-ROM | disk | FTP | other *** search
/ Graphics Programming Black Book (Special Edition) / BlackBook.bin / disk1 / source / chapter52 / xsharp14.exe / L3.C < prev    next >
Text File  |  1991-12-05  |  4KB  |  88 lines

  1. /* Routines to perform incremental rotations around the three axes. */
  2. #include <math.h>
  3. #include "polygon.h"
  4.  
  5. /* Concatenate a rotation by Angle around the X axis to the
  6.    transformation in XformToChange, placing the result back into
  7.    XformToChange. */
  8. void AppendRotationX(Xform XformToChange, double Angle)
  9. {
  10.    Fixedpoint Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
  11.    Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle));
  12.    Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle));
  13.  
  14.    /* Calculate the new values of the six affected matrix entries */
  15.    Temp10 = FixedMul(CosTemp, XformToChange[1][0]) +
  16.          FixedMul(-SinTemp, XformToChange[2][0]);
  17.    Temp11 = FixedMul(CosTemp, XformToChange[1][1]) +
  18.          FixedMul(-SinTemp, XformToChange[2][1]);
  19.    Temp12 = FixedMul(CosTemp, XformToChange[1][2]) +
  20.          FixedMul(-SinTemp, XformToChange[2][2]);
  21.    Temp20 = FixedMul(SinTemp, XformToChange[1][0]) +
  22.          FixedMul(CosTemp, XformToChange[2][0]);
  23.    Temp21 = FixedMul(SinTemp, XformToChange[1][1]) +
  24.          FixedMul(CosTemp, XformToChange[2][1]);
  25.    Temp22 = FixedMul(SinTemp, XformToChange[1][2]) +
  26.          FixedMul(CosTemp, XformToChange[2][2]);
  27.    /* Put the results back into XformToChange */
  28.    XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
  29.    XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20; 
  30.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  31. }
  32.  
  33. /* Concatenate a rotation by Angle around the Y axis to the
  34.    transformation in XformToChange, placing the result back into
  35.    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 the
  62.    transformation in XformToChange, placing the result back into
  63.    XformToChange. */
  64. void AppendRotationZ(Xform XformToChange, double Angle)
  65. {
  66.    Fixedpoint Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
  67.    Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle));
  68.    Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle));
  69.  
  70.    /* Calculate the new values of the six affected matrix entries */
  71.    Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
  72.          FixedMul(-SinTemp, XformToChange[1][0]);
  73.    Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
  74.          FixedMul(-SinTemp, XformToChange[1][1]);
  75.    Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
  76.          FixedMul(-SinTemp, XformToChange[1][2]);
  77.    Temp10 = FixedMul(SinTemp, XformToChange[0][0]) +
  78.          FixedMul(CosTemp, XformToChange[1][0]);
  79.    Temp11 = FixedMul(SinTemp, XformToChange[0][1]) +
  80.          FixedMul(CosTemp, XformToChange[1][1]);
  81.    Temp12 = FixedMul(SinTemp, XformToChange[0][2]) +
  82.          FixedMul(CosTemp, XformToChange[1][2]);
  83.    /* Put the results back into XformToChange */
  84.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  85.    XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
  86.    XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
  87. }
  88.