让我们考虑以下问题:
我们有4分{a,b,c,d}
,想要检查一下
如果我们连接,[a;b]
和[c;d]
会相互交叉
在纸上逐行分。
该点定义为(x|y)
,因此可以将其绘制为二维
坐标系。
如何在O(1)
中查看?
答案 0 :(得分:2)
有一种有效的方法来检查两个线段是否相交: 如果C和D点位于相对于AB线的不同半平面中,则AB和CD相交,并且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