/* Fonctions arithmétiques en virgule fixe de calcul matricielle Testées avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include "polygon.h" /* La matrice multiplie Xform par SourceVec, et stocke le résultat dans DestVec. Multiplie une matrice 4x4 fois une matrice 4x1; Le résultat est une matrice 4x1. Triche en supposant que la coordonnée W est à 1 et que la rangée du bas de la matrice est 0 0 0 1, ne s'embarrasse pas ainsi à paramétrer la coordonnée W de la destination */ void XformVec(Xform WorkingXform, Fixedpoint *SourceVec, Fixedpoint *DestVec) { int i; for (i=0; i<3; i++) DestVec[i] = FixedMul(WorkingXform[i][0], SourceVec[0]) + FixedMul(WorkingXform[i][1], SourceVec[1]) + FixedMul(WorkingXform[i][2], SourceVec[2]) + WorkingXform[i][3]; /* pas besoin de multiplier par W = 1 */ } /* La matrice multiplie SourceXform1 par SourceXform2 et stocke le résultat dans DestXform. Multiplie une matrice 4x4 fois une matrice 4x4; le résultat est une matrice 4x4. Triche en supposant que la rangée du bas de la matrice est 0 0 0 1, et ne s'embarrasse pas ainsi à paramétrer la rangée du bas de la destination */ void ConcatXforms(Xform SourceXform1, Xform SourceXform2, Xform DestXform) { int i, j; for (i=0; i<3; i++) { for (j=0; j<4; j++) DestXform[i][j] = FixedMul(SourceXform1[i][0], SourceXform2[0][j]) + FixedMul(SourceXform1[i][1], SourceXform2[1][j]) + FixedMul(SourceXform1[i][2], SourceXform2[2][j]) + SourceXform1[i][3]; } }