假设您有一个矩形,左下角为0,0,右上角为100,100。 现在两条线与矩形相交。我必须找出交叉点的坐标。我做到了。现在的问题是我无法判断它是否在矩形内部。我用了双重比较。但我认为它给了我错误的答案。假设交点是(x,y)。我使用该检查进行比较:if(x> = 0.0&& x< = 100.0&>> = 0.0& y< = 100.0)。我该怎么办?
//this function generates line
line genline( int x1 , int y1 , int x2 , int y2 ){
line l ;
l.A = y2 - y1 ;
l.B = x1 - x2 ;
l.C = l.A * x1 + l.B * y1 ;
return l ;
}
//this function checks intersection
bool intersect( line m ,line n ) {
int det = m.A * n.B - m.B * n.A ;
if( det == 0 ){
return false ;
}
else {
double x = ( n.B * m.C - m.B * n.C ) / ( det * 1.0 ) ;
double y = ( m.A * n.C - n.A * m.C ) / ( det * 1.0 ) ;
if( x >= 0.0 && x <= L && y >= 0.0 && y <= W ) { return true ; }
else{ return false ; }
}
}
修改 这两条线都被拉伸到无限远。
答案 0 :(得分:1)
你的数学看起来是对的。顺便说一下,如果一条线与某个东西相交,那么它总是在那里。
答案 1 :(得分:0)
检查点是否在矩形内是相对容易的。然而,挑战在于找到两个线段之间的交叉点。对于该问题存在大量的极端情况,并且浮点数的有限精度在这里起到了巨大作用。
您的算法似乎过于简单化了。有关此主题的深入讨论,您可以查看this和this。这两篇文章研究了使用浮点数找到两条线的交点的问题。请注意,它们是关于MATLAB而不是C ++,虽然这不会改变问题,并且算法很容易翻译成任何语言。
根据应用程序的不同,即使使用巧妙的技巧,浮点表示也可能不会简单地将其切割为某些几何问题。 CGAL是一个C ++库,专门用于处理这些问题的计算几何。必要时,它使用任意精度算术来处理退化情况。
答案 2 :(得分:0)
当你处理浮点(或双精度)时,对相等性的测试是天真的,并且在边缘情况下会失败。你所做的每一次比较都应该参考“epsilon”,这是一个无关紧要的极小数量。如果两个数字彼此在epsilon之内,那么它们被认为是相等的。
例如,您需要:
而不是“if(a == b)”bool isEqual(double a, double b, double epsilon = 1.E-10)
{ return fabs(a - b) <= epsilon;
}
根据您的问题域选择合适的epsilon值。