为什么我的矩阵旋转不通过我学校的单元测试?

时间:2016-05-28 05:08:50

标签: c++ unit-testing matrix

基本上我们被要求用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,所以一点帮助将不胜感激!

注意:单元测试的工作原理是将操作结果与应评估结果进行比较。

1 个答案:

答案 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;
}

此外,为了应用旋转(数学是正确的),你必须将旋转矩阵乘以另一个矩阵,而你正在做相反的事情。