/* Routines to perform incremental rotations around the three axes */ #include #include "polygon.h" /* Concatenate a rotation by Angle around the X axis to the transformation in XformToChange, placing result back in XformToChange. */ void AppendRotationX(double XformToChange[4][4], double Angle) { double Temp10, Temp11, Temp12, Temp20, Temp21, Temp22; double CosTemp = cos(Angle), SinTemp = sin(Angle); /* Calculate the new values of the four affected matrix entries */ Temp10 = CosTemp*XformToChange[1][0]+ -SinTemp*XformToChange[2][0]; Temp11 = CosTemp*XformToChange[1][1]+ -SinTemp*XformToChange[2][1]; Temp12 = CosTemp*XformToChange[1][2]+ -SinTemp*XformToChange[2][2]; Temp20 = SinTemp*XformToChange[1][0]+ CosTemp*XformToChange[2][0]; Temp21 = SinTemp*XformToChange[1][1]+ CosTemp*XformToChange[2][1]; Temp22 = SinTemp*XformToChange[1][2]+ CosTemp*XformToChange[2][2]; /* Put the results back into XformToChange */ XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20; XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22; } /* Concatenate a rotation by Angle around the Y axis to the transformation in XformToChange, placing result back in XformToChange. */ void AppendRotationY(double XformToChange[4][4], double Angle) { double Temp00, Temp01, Temp02, Temp20, Temp21, Temp22; double CosTemp = cos(Angle), SinTemp = sin(Angle); /* Calculate the new values of the four affected matrix entries */ Temp00 = CosTemp*XformToChange[0][0]+ SinTemp*XformToChange[2][0]; Temp01 = CosTemp*XformToChange[0][1]+ SinTemp*XformToChange[2][1]; Temp02 = CosTemp*XformToChange[0][2]+ SinTemp*XformToChange[2][2]; Temp20 = -SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[2][0]; Temp21 = -SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[2][1]; Temp22 = -SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[2][2]; /* Put the results back into XformToChange */ XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01; XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20; XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22; } /* Concatenate a rotation by Angle around the Z axis to the transformation in XformToChange, placing result back in XformToChange. */ void AppendRotationZ(double XformToChange[4][4], double Angle) { double Temp00, Temp01, Temp02, Temp10, Temp11, Temp12; double CosTemp = cos(Angle), SinTemp = sin(Angle); /* Calculate the new values of the four affected matrix entries */ Temp00 = CosTemp*XformToChange[0][0]+ -SinTemp*XformToChange[1][0]; Temp01 = CosTemp*XformToChange[0][1]+ -SinTemp*XformToChange[1][1]; Temp02 = CosTemp*XformToChange[0][2]+ -SinTemp*XformToChange[1][2]; Temp10 = SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[1][0]; Temp11 = SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[1][1]; Temp12 = SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[1][2]; /* Put the results back into XformToChange */ XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01; XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12; }