前段时间我写了一个算法来找到两条线段之间的交点。不过,回过头来看它,我注意到在两个不同的地方除以零是可能的。从逻辑的角度来看,我认为这样做是可以的,但是如果这样做,程序当然会崩溃。这是算法:
class Segment{
public:
Vector first, second;
bool getIntersection(const Segment arg, Vector * intersect = NULL)const{
Segment segment(b - a, arg.b - arg.a);
double s, t;
// These two equations run the risk of division by zero
s = (-segment.a.y * (a.x - arg.a.x) + segment.a.x * (a.y - arg.a.y))
/ (-segment.b.x * segment.a.y + segment.a.x * segment.b.y);
t = ( segment.b.x * (a.y - arg.a.y) - segment.b.y * (a.x - arg.a.x))
/ (-segment.b.x * segment.a.y + segment.a.x * segment.b.y);
if (s > 0.0 && s < 1.0 && t > 0.0 && t < 1.0)
{
// Collision detected
if (intersect != NULL)
{
intersect->x = a.x + (t * segment.a.x);
intersect->y = a.y + (t * segment.a.y);
}
return true;
}
return false; // No collision
}
};
如果除数后面的值(并且可能结果是)全为零,则在计算s
和的地方除以零是可能的。t
从几何学的角度来看,这意味着两条线相互平行;在这种情况下,不应将平行线视为相交,即使它们完全重叠。
有没有办法让这个函数除以零?当然,假设它不会影响算法背后的逻辑(我认为任何带有 NAN 或 INF 的东西都不会导致冲突)?或者我应该使用更好的线段相交算法吗?