1.gp_Dir
方向的相等判断:方向相同。(方向夹角接近0度)
inline Standard_Boolean gp_Dir::IsEqual(const gp_Dir& Other, const Standard_Real AngularTolerance) const
{
return Angle (Other) <= AngularTolerance;
}
2.gp_Vec
向量的相等判断:长度相同,方向相同。(两个向量有一个接近0向量,不再需要计算向量夹角)
Standard_Boolean gp_Vec::IsEqual(const gp_Vec& Other, const Standard_Real LinearTolerance,const Standard_Real AngularTolerance) const
{
if (Magnitude () <= LinearTolerance || Other.Magnitude () <= LinearTolerance)
{
Standard_Real val = Magnitude() - Other.Magnitude();
if (val < 0) val = - val;
return val <= LinearTolerance;
}
else
{
Standard_Real val = Magnitude() - Other.Magnitude();
if (val < 0) val = - val;
return val <= LinearTolerance && Angle(Other) <= AngularTolerance;
}
}
3.gp_Pnt
点的相等判断:位置相同。(两点间的距离接近0)
inline Standard_Boolean gp_Pnt::IsEqual(const gp_Pnt& Other,const Standard_Real LinearTolerance) const
{
return Distance (Other) <= LinearTolerance;
}
4.gp_XYZ
XYZ相等判断:每个分量都相同。
Standard_Boolean gp_XYZ::IsEqual (const gp_XYZ& Other,const Standard_Real Tolerance) const
{
Standard_Real val;
val = x - Other.x;
if (val < 0) val = - val;
if (val > Tolerance) return Standard_False;
val = y - Other.y;
if (val < 0) val = - val;
if (val > Tolerance) return Standard_False;
val = z - Other.z;
if (val < 0) val = - val;
if (val > Tolerance) return Standard_False;
return Standard_True;
}
5. gp_Quaternion
四元数相等判断:每个分量都相同。
Standard_Boolean gp_Quaternion::IsEqual (const gp_Quaternion& theOther) const
{
if (this == &theOther)
return Standard_True;
return Abs (x - theOther.x) <= gp::Resolution() &&
Abs (y - theOther.y) <= gp::Resolution() &&
Abs (z - theOther.z) <= gp::Resolution() &&
Abs (w - theOther.w) <= gp::Resolution();
}