我正在编写用于 opengl 图形的数学类,它使用列主矩阵排序。这是家庭作业。
对于 mat3(我的矩阵 3x3 类)以及其他矩阵类,我想出了使用联合表示法来描述矩阵数据。现在我担心我的排序是错误的(例如行专业而不是列专业)。
#define real float
union
{
real _data[9];
struct
{
real _11; real _12; real _13;
real _21; real _22; real _23;
real _31; real _32; real _33;
};
struct
{
real _a; real _b; real _c;
real _d; real _e; real _f;
real _g; real _h; real _i;
};
};
我是否应该按如下方式编写第二个结构:
struct
{
real _a; real _d; real _g;
real _b; real _e; real _h;
real _c; real _f; real _i;
};
此外,我应该按如下方式编写第一个结构:
struct
{
real _11; real _21; real _31;
real _12; real _22; real _32;
real _13; real _23; real _33;
};
这会影响矩阵乘法或其他数学运算(行列式、逆运算、转置...)的顺序吗?例如,目前,我的 mat3 乘法函数如下所示:
mat3 operator * ( const mat3 & l, const mat3 & r )
{
// matrix matrix multiply
return mat3(
( (l._11 * r._11) + (l._12 * r._21) + (l._13 * r._31) ),
( (l._11 * r._12) + (l._12 * r._22) + (l._13 * r._32) ),
( (l._11 * r._13) + (l._12 * r._23) + (l._13 * r._33) ),
( (l._21 * r._11) + (l._22 * r._21) + (l._23 * r._31) ),
( (l._21 * r._12) + (l._22 * r._22) + (l._23 * r._32) ),
( (l._21 * r._13) + (l._22 * r._23) + (l._23 * r._33) ),
( (l._31 * r._11) + (l._32 * r._21) + (l._33 * r._31) ),
( (l._31 * r._12) + (l._32 * r._22) + (l._33 * r._32) ),
( (l._31 * r._13) + (l._32 * r._23) + (l._33 * r._33) )
);
}
据我了解,这个问题让很多人感到困惑。我认为在阅读了有关该主题的教科书之后会出现混淆,然后不得不坐在 IDE 前编写课程,这两个主题很少被涵盖在一起。