/* Routines pour effectuer des rotations incrémentales autour de trois axes. Testées avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include #include "polygon.h" /* Concatène une rotation de Angle autour de l'axe X axis à la transformation dans XformToChange, en remettant le résultat dans XformToChange. */ void AppendRotationX(Xform XformToChange, double Angle) { Fixedpoint Temp10, Temp11, Temp12, Temp20, Temp21, Temp22; Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle)); Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle)); /* Calcule les nouvelles valeurs des six entrées affectées de la matrice */ Temp10 = FixedMul(CosTemp, XformToChange[1][0]) + FixedMul(-SinTemp, XformToChange[2][0]); Temp11 = FixedMul(CosTemp, XformToChange[1][1]) + FixedMul(-SinTemp, XformToChange[2][1]); Temp12 = FixedMul(CosTemp, XformToChange[1][2]) + FixedMul(-SinTemp, XformToChange[2][2]); Temp20 = FixedMul(SinTemp, XformToChange[1][0]) + FixedMul(CosTemp, XformToChange[2][0]); Temp21 = FixedMul(SinTemp, XformToChange[1][1]) + FixedMul(CosTemp, XformToChange[2][1]); Temp22 = FixedMul(SinTemp, XformToChange[1][2]) + FixedMul(CosTemp, XformToChange[2][2]); /* Met les résultats dans 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; } /* Concatène une rotation de Angle autour de l'axe Y à la transformation dans XformToChange, en remettant le résultat dans XformToChange. */ void AppendRotationY(Xform XformToChange, double Angle) { Fixedpoint Temp00, Temp01, Temp02, Temp20, Temp21, Temp22; Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle)); Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle)); /* Calcule les nouvelles valeurs des six entrées affectées de la matrice */ Temp00 = FixedMul(CosTemp, XformToChange[0][0]) + FixedMul(SinTemp, XformToChange[2][0]); Temp01 = FixedMul(CosTemp, XformToChange[0][1]) + FixedMul(SinTemp, XformToChange[2][1]); Temp02 = FixedMul(CosTemp, XformToChange[0][2]) + FixedMul(SinTemp, XformToChange[2][2]); Temp20 = FixedMul(-SinTemp, XformToChange[0][0]) + FixedMul( CosTemp, XformToChange[2][0]); Temp21 = FixedMul(-SinTemp, XformToChange[0][1]) + FixedMul(CosTemp, XformToChange[2][1]); Temp22 = FixedMul(-SinTemp, XformToChange[0][2]) + FixedMul(CosTemp, XformToChange[2][2]); /* Met les résultats dans 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; } /* Concatène une rotation de Angle autour de l'axe Z à la transformation dans XformToChange, en remettant le résultat dans XformToChange. */ void AppendRotationZ(Xform XformToChange, double Angle) { Fixedpoint Temp00, Temp01, Temp02, Temp10, Temp11, Temp12; Fixedpoint CosTemp = DOUBLE_TO_FIXED(cos(Angle)); Fixedpoint SinTemp = DOUBLE_TO_FIXED(sin(Angle)); /* Calcule les nouvelles valeurs des six entrées affectées de la matrice */ Temp00 = FixedMul(CosTemp, XformToChange[0][0]) + FixedMul(-SinTemp, XformToChange[1][0]); Temp01 = FixedMul(CosTemp, XformToChange[0][1]) + FixedMul(-SinTemp, XformToChange[1][1]); Temp02 = FixedMul(CosTemp, XformToChange[0][2]) + FixedMul(-SinTemp, XformToChange[1][2]); Temp10 = FixedMul(SinTemp, XformToChange[0][0]) + FixedMul(CosTemp, XformToChange[1][0]); Temp11 = FixedMul(SinTemp, XformToChange[0][1]) + FixedMul(CosTemp, XformToChange[1][1]); Temp12 = FixedMul(SinTemp, XformToChange[0][2]) + FixedMul(CosTemp, XformToChange[1][2]); /* Met les résultats dans 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; }