基本上我们被要求用C ++为我的大学课程创建一个矩阵调用。
首先,我的类使用列主构造函数,但它将它放在内存行major:
Matrix2::Matrix2(float R1C1, float R1C2, float R2C1, float R2C2)
{
//Row major order.
//Parameters written as column major (a normal matrix) but entered into memory as row major.
matrix[0] = R1C1;
matrix[1] = R2C1;
matrix[2] = R1C2;
matrix[3] = R2C2;
}
我相信单元测试需要。 如果没有指定参数,矩阵被定义为它们的单位矩阵。
所以,我用这段代码旋转我的矩阵:
void Matrix2::setRotateZ(float radians)
{
(*this) = (*this)*Matrix2( cosf(radians), -sinf(radians),
sinf(radians), cosf(radians));
}
我在维基百科和我的单一演讲幻灯片上找到了这段代码。它似乎与列主要的matricies(由于我的构造函数,这是数据的输入方式)有关。
还要注意" setRotateZ"实际应该是" rotateZ",因为它在被调用不止一次时会累积旋转。
我的乘法重载如下:
Matrix2 Matrix2::operator*(Matrix2& o)
{
Matrix2 newMatrix(0.0f, 0.0f, 0.0f, 0.0f);
newMatrix.matrix[0] = matrix[0] * o.matrix[0] + matrix[2] * o.matrix[1];
newMatrix.matrix[2] = matrix[0] * o.matrix[2] + matrix[2] * o.matrix[3];
newMatrix.matrix[1] = matrix[1] * o.matrix[0] + matrix[3] * o.matrix[1];
newMatrix.matrix[3] = matrix[1] * o.matrix[2] + matrix[3] * o.matrix[3];
return newMatrix;
}
它只是像普通矩阵一样倍增(假设它是行的主要部分,0是R1C1而1是R2C1等)
非常好,如果我交换:
-sinf(radians)
和
sinf(radians)
在上面的setRotateZ函数中,一切正常,矩阵通过所有测试,包括乘法,旋转和加法。
然而,正如现在所示,矩阵无法旋转。
据我所知,交换符号函数应仅适用于行主矩阵,但由于我在构造函数中交换它,因此将其作为列专业输入应该有效。
我做错了什么?这让我烦恼,即使我已经通过交换价值来让它工作,我想知道发生了什么。
我几乎是一个矩阵newb,所以一点帮助将不胜感激!
注意:单元测试的工作原理是将操作结果与应评估结果进行比较。
答案 0 :(得分:2)
首先,我的类使用列主要构造函数,但它放置了 它在内存行主要
嗯,您发布的代码显示完全相反(wiki):
Matrix2(float R1C1, float R1C2, float R2C1, float R2C2)
// this ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ is ROW major!
{
matrix[0] = R1C1;
matrix[1] = R2C1; // <-- this is COLUMN major!
matrix[2] = R1C2; // <--
matrix[3] = R2C2;
}
此外,为了应用旋转(数学是正确的),你必须将旋转矩阵乘以另一个矩阵,而你正在做相反的事情。