两线段相交的快速判断-叉积的一个应用

 设两个有向线段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

 

你可能感兴趣的:(数字图像处理与机器视觉)