1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
// la sémantique mathématique est a revoir: il est impossible,
// mathématiquement, de multiplier une matrice 4x4 par un
// vecteur 1x3. Je te conseille de renommer cette fonction
// selon l'opération qui est réellement effecutée (projection ?
// rotation ? transform ?...).
// Ton code effectue une multiplication entre la matrice 3x3
// supérieure gauche et un vecteur 1x3. La solution pourrait
// consister a faire une fonction qui extrait la matrice 3x3 en
// question dans une classe Matrix3x3 et de coder l'opérateur
// Vector3D operator*(const Matrix3x3&, const Vector3D&).
template <class T>
Vector3D<T> operator*(const Matrix4x4<T> &m, const Vector3D<T> &v)
{
// on crée la valeur de retour et on l'initialise directement
Vector3D<T> ret(0,0,0);
// le bloc alloué ici est perdu a cause de la ligne suivante
// T *Tb = new T[16];
// écrase la valeur de Tb courante
// Tb = v.getArray();
// les blocs alloués ici sont perdus à cause de l'affectation suivante
// T **mat = new T*[4];
// for (int i = 0; i < 4; i++)
// mat[i] = new T[4];
// écrase la valeur de mat courante
// mat = m.getArray4x4();
// ---------
// on remplace le tout par 2 appels de fonction, qui renvoie les
// tableaux necessaires au calcul. Puisque ceux ci ne sont pas
// modifiés, pas besoin de copie:
// on peut d'ailleurs se passer de Tb, donc je le met directement
// en commentaire
// T* Tb = v.getArray();
T** mat = m.getArray4x4();
// ça, on va pas en avoir besoin
// T S = 0;
// on ré-écrit la boucle; on va travailler sur ret directement.
T* Tret = ret.getArray();
// la boucle elle même.
// Comme je l'ai dit plus haut, ton code semble faire une multiplication
// de la matrice 3x3 supérieure gauche: S est discardé si i == 3 donc
// l'exécution de "S += mat[i][j]*v[j];" ne sert à rien si i == 3. Tu peux
// changer la condition d'arrêt sur i, ce qui t'évite de faire un test à
// l'intérieur de la boucle.
for (int i=0; i<3; ++i)
{
for (int j=0; j<3; ++j)
{
Tret[i] += mat[i][j] * v[j];
}
}
// et bien sur, tout ça vire... (d'autant plus que ça n'est pas correct:
// Tb pointe sur les données de v, donc elles sont modifiées au fur et
// à mesure du calcul...)
// for (int i = 0; i < 4; i++)
// {
// for (int j = 0; j < 3; j++)
// S += mat[i][j]*v[j];
// if (i < 3)
// Tb[i] = S;
// S = 0;
// }
// Plus besoin de ça puisque ret est correctement initialisé...
// ret.x = Tb[0];
// ret.y = Tb[1];
// ret.z = Tb[2];
// soyons fous: retournons une copie de ret!
// return Vector3D<T>(ret.x, ret.y, ret.z);
return ret;
// code non atteint - et tant mieux...
// for(int i = 0; i < 4; i++)
// delete [] mat[i];
// delete [] mat;
} |
Partager