2015-07-10 50 views
1

让我们考虑以下问题:如何检查点之间的连接是否相互交叉?

我们有一个4点{a,b,c,d}和希望,如果我们通过在纸上线连接 点检查 方式[a;b][c;d]将相互交叉。

该点被定义为(x|y),因此它可以被绘制到一个2维的坐标系统 中。

我该如何检查O(1)

+1

的C++是无关紧要的。这是基本几何:http://www.wikihow.com/Algebraically-Find-the-Intersection-of-Two-Lines –

+0

@Marc B,问题是关于两行**段**而不是两行。因此,从您发布的链接中获得答案将超出许多程序员的数学技能。答案在这个链接中更加明显https://en.wikipedia.org/wiki/Intersection_%28Euclidean_geometry%29#Two_line_segments – JSF

回答

2

有效的方法检查两条线段是否相交: AB和CD相交,如果C和D点位于相对于AB线的不同半平面中,并且C和D位于相对于CD线。 Here is简洁Python实现:

def ccw(A,B,C): 
    return (C.y-A.y)*(B.x-A.x) > (B.y-A.y)*(C.x-A.x) 

def intersect(A,B,C,D): 
     return ccw(A,C,D) != ccw(B,C,D) and ccw(A,B,C) != ccw(A,B,D) 

的特殊情况下彻底治疗(共线,重合)is described here

+0

有没有办法返回交点本身? – Coder55

+0

这是另外一个问题。 Gavin的答案在这里:http://stackoverflow.com/a/1968345/844416给出了很好的交点计算的实际实现 – MBo