I made a Matrix class. and added some methods for matrix calculation. I met some problems related with floating point operation. First time, I made a eqaul method like below:
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]);
}
Under case, it returned wrong answer.
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
I expected m1
and m2
are same, because m2
was made with 2-times inverted m1
.
So I though matrix comparison operation should include floating pointer comparison algorithm.
like a AlMostEquals()
or floatHardCompare()
method.
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
or DOUBLE_EPSILON
I'd like to ask that.
Generally, are the matrix4
implementations considered floating point comparison logic in the graphics library or graphic engine (include game engine)? or not?
Anyone has more good idea?