我做了一个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
我预计m1
和m2
相同,因为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.0000000001
或DOUBLE_EPSILON
我想问一下。
通常,matrix4
实现是否被视为图形库或图形引擎(包括游戏引擎)中的浮点比较逻辑?不是吗?
任何人都有更好的主意吗?