设两个有向线段p1p2,p3p4 ,判断他们是否相交的充分必要条件是:
p1, p2 位于包含p3,p4的直线的两侧,而且p3,p4也位于包含p1,p2的直线的两侧。另外还要考虑边界条件。下面是伪代码:
SEGMENTS-INTERSECT(p1, p2, p3, p4) 1 d1 ← DIRECTION(p3, p4, p1) 2 d2 ← DIRECTION(p3, p4, p2) 3 d3 ← DIRECTION(p1, p2, p3) 4 d4 ← DIRECTION(p1, p2, p4) 5 if ((d1 > 0 and d2 < 0) or (d1 < 0 and d2 > 0)) and ((d3 > 0 and d4 < 0) or (d3 < 0 and d4 > 0)) 6 then return TRUE 7 elseif d1 = 0 and ON-SEGMENT(p3, p4, p1) 8 then return TRUE 9 elseif d2 = 0 and ON-SEGMENT(p3, p4, p2) 10 then return TRUE 11 elseif d3 = 0 and ON-SEGMENT(p1, p2, p3) 12 then return TRUE 13 elseif d4 = 0 and ON-SEGMENT(p1, p2, p4) 14 then return TRUE 15 else return FALSE
DIRECTION(pi, pj, pk) //参数pi 是个Point.(x,y) 1 return (pk - pi) × (pj - pi) //这里计算叉积,叉积公式:P1 X P2 = x1y2 - x2y1; ON-SEGMENT(pi, pj, pk) 1 if min(xi, xj) ≤ xk ≤ max(xi, xj) and min(yi, yj) ≤ yk ≤ max(yi, yj) 2 then return TRUE 3 else return FALSE