matrix4比较方法应该考虑浮点比较逻辑吗?

时间:2017-09-18 09:32:59

标签: c++ matrix floating-point comparison

我做了一个Matrix课程。并添加了一些矩阵计算方法。 我遇到了一些与浮点运算有关的问题。 第一次,我做了如下的eqaul方法:

bool
FloatMatrix4::operator ==(const FloatMatrix4& rhs) const
{
  if (this == &rhs)
    return true;
  return (matrix[0][0] == rhs.matrix[0][0] &&
          matrix[0][1] == rhs.matrix[0][1] &&
          matrix[0][2] == rhs.matrix[0][2] &&
          matrix[0][3] == rhs.matrix[0][3] &&
          matrix[1][0] == rhs.matrix[1][0] &&
          matrix[1][1] == rhs.matrix[1][1] &&
          matrix[1][2] == rhs.matrix[1][2] &&
          matrix[1][3] == rhs.matrix[1][3] &&
          matrix[2][0] == rhs.matrix[2][0] &&
          matrix[2][1] == rhs.matrix[2][1] &&
          matrix[2][2] == rhs.matrix[2][2] &&
          matrix[2][3] == rhs.matrix[2][3] &&
          matrix[3][0] == rhs.matrix[3][0] &&
          matrix[3][1] == rhs.matrix[3][1] &&
          matrix[3][2] == rhs.matrix[3][2] &&
          matrix[3][3] == rhs.matrix[3][3]);
}

根据情况,它返回了错误的答案。

m1[4][4] = 
 1.000000, 0.000000, 0.000000, 1.000000,
 2.000000, 1.000000, 0.000000, 1.000000,
 3.000000, 1.100000, 1.000000, 1.000000,
 4.000000, 0.000000, 0.000000, 1.000000`

m2[4][4] = 
1.000000, 0.000000, 0.000000, 1.000000,
2.000000, 1.000000, 0.000000, 1.000000,
3.000000, 1.100000, 1.000000, 1.000000,
4.000000, 0.000000, -0.000000, 1.000000

我预计m1m2相同,因为m2是2次倒置m1

所以我虽然矩阵比较操作应该包括浮点指针比较算法。 比如AlMostEquals()floatHardCompare()方法。

bool matrixCompare(const FloatMatrix4& m1, const FloatMatrix4& m2)
{
  return (
    floatCompare(m1.matrix[0][0], m2.matrix[0][0], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[0][1], m2.matrix[0][1], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[0][2], m2.matrix[0][2], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[0][3], m2.matrix[0][3], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[1][0], m2.matrix[1][0], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[1][1], m2.matrix[1][1], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[1][2], m2.matrix[1][2], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[1][3], m2.matrix[1][3], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[2][0], m2.matrix[2][0], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[2][1], m2.matrix[2][1], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[2][2], m2.matrix[2][2], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[2][3], m2.matrix[2][3], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[3][0], m2.matrix[3][0], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[3][1], m2.matrix[3][1], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[3][2], m2.matrix[3][2], ALMOST_ZERO)==0 &&
    floatCompare(m1.matrix[3][3], m2.matrix[3][3], ALMOST_ZERO)==0);
}

ALMOST_ZERO = 0.0000000001DOUBLE_EPSILON

我想问一下。 通常,matrix4实现是否被视为图形库或图形引擎(包括游戏引擎)中的浮点比较逻辑?不是吗?

任何人都有更好的主意吗?

0 个答案:

没有答案