2011-09-21 167 views
0

假设你有一个矩形,左下角的点0,0和右上角的点是100,100。 现在两条线相交矩形。我必须找出交点的坐标。我已经做到了。现在的问题是我不知道它是否在矩形内。我用双重比较。但我认为这是给我错误的答案。假设交点是(x,y)。我用这种检查进行比较:如果(X> = 0.0 & & X < = 100.0 & & Y> = 0.0 & &Ŷ< = 100.0)。我该怎么办?C++浮点比较

//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

你确定你的交点计算是正确的吗?我们可以看到更多的代码吗? – quasiverse

+0

你的矩形测试很好。请描述你为什么认为失败。请给出一个x,y值的例子,你的测试失败了,你觉得它不应该。 –

+0

“但我认为这是给我错误的答案”不够好。你需要描述它在你眼中的失败。让我们猜测是不好的。 –

回答

1

你的数学看起来是对的。顺便说一下,如果一条线与某个东西相交,它总是在某个东西的内部。

+1

这应该是一个评论,而不是一个答案。 – quasiverse

+0

如果交点的y是99.999999,会发生什么情况......编译器会将其舍入吗? – PEIN

+0

它没有指出OP说他有什么问题。 – quasiverse

0

检查点是否在矩形内相对容易。然而,挑战在于找到两条线段之间的交点。这个问题有很多角落案例,浮点数的精确度有限在这里发挥了巨大的作用。

你的算法似乎过于简单。有关此主题的更深入讨论,您可以查看thisthis。这两部分文章研究了使用浮点数寻找两条线的交点的问题。请注意,它们是关于MATLAB而不是C++的,尽管这不会改变问题,并且算法很容易翻译成任何语言。

根据应用程序的不同,即使使用巧妙的技巧,浮点表示也可能不会简单地将其切割为几何几何问题。 CGAL是一个致力于计算几何处理这些类问题的C++库。必要时使用任意的精确算术来处理退化情况。

+0

仅仅因为它看起来过于简单并不意味着它不正确:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry2 – quasiverse

+0

@quasiverse我在博客中包含了两个链接,详细讨论了这个问题。快速查看表明OP的算法不考虑很多情况。它基本上是将数学转化为代码而不考虑浮点表示的数值问题。所以是的,我确实看到了一个问题。不幸的是,您提供的链接不处理问题并且不完整。 – AlefSin

+0

查看链接,其中一半似乎是图片,而相当多的代码似乎是“情节(plot)”,但除此之外,重点是代码*是*正确的,更一般的说,事情不必复杂才是正确的。 – quasiverse

0

当你处理浮点(或双精度)时,测试相等性是天真的,在边缘情况下会失败。你所做的每一个比较都应该参考“epsilon”,这个数量非常小,无关紧要。如果两个数字在彼此的ε内,那么它们被认为是相等的。

,而不是例如, “如果(A == B)”,您需要:

bool isEqual(double a, double b, double epsilon = 1.E-10) 
{ return fabs(a - b) <= epsilon; 
} 

选择取决于你的问题域小量一个合适的值。