我尝试编写一个 std::map< Vector3D, double > ,其中共线(平行或反平行)向量应该共享相同的键。
作为比较函数,我使用以下函数(在 isEqualEnough() 中具有 1e-9 容差),该函数是在使用 std::map 中的(数学)向量的帮助下创建的
struct Vector3DComparator
{
bool operator() (const Vector3D& lhsIn, const Vector3D& rhsIn) const
{
Vector3D lhs = lhsIn.absolute(); // make all members positive
Vector3D rhs = rhsIn.absolute();
if ((lhs.z < rhs.z))
return true;
if ((isEqualEnough(lhs.z, rhs.z))
&& (lhs.y < rhs.y))
return true;
if ((isEqualEnough(lhs.z, rhs.z))
&& (isEqualEnough(lhs.y, rhs.y))
&& (lhs.x < rhs.x))
return true;
return false;
}
};
当我将立方体的法线插入我的地图时,我应该得到 3 个不同的值(因为我不关心方向)但我得到 4 个:
- x=1 y=0 z=0
- x=0 y=1 z=0
- x=0 y=0 z=1
- x=0 y=2.2e-16 z=1
比较函数在某种程度上是错误的,但每当我尝试修复它时,我都会收到一个断言告诉我“表达式:无效比较器”。
有人发现错误吗?