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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值