计算几何之 判断两个线段是否相交

1. 判断两个线段是否相交,需要检测线段是否两两横跨。所谓横跨,即是点p1 位于向量n 的一边,且另一点p2 位于向量n 的另一边; 

2. 此外, 还需考虑边界情况,即一条线段的某个端点位于另一条线段上。

判断线段p1p2, p3p4 是否相交, 算法流程如下:

SEGMENT-INTERSECT(p1, p2, p3, p4)

// 计算三个点构成的两个向量的叉积;

1. d1 = DIR (p3, p4, p1)

2. d2 = DIR (p3, p4, p2)

3. d3 = DIR (p1, p2, p3)

4. d4 = DIR (p1, p2, p4)

5. if ((d1d2 < 0 and d3d4 < 0)

    return TRUE;

// 前者判断 d1 =0 时, 点p1 在线段p3p4 所在直线上,  后者 ON_SEGMENT(p3, p4, p1) 判断p1 是否在对角线p3p4所在矩形内;综合起来就是 点p1 是否严格在线段p3p4上.

6. else if d1 == 0 and  ON_POLYGON (p3, p4, p1)  

    return TRUE;

7. else if d2 == 0 and  ON_POLYGON (p3, p4, p2)  

    return TRUE;

8. else if d3 == 0 and  ON_POLYGON (p1, p2, p3)  

    return TRUE;

9. else if d4 == 0 and  ON_POLYGON (p1, p2, p4)  

    return TRUE;


//  计算向量pipk 和向量pipj 的叉积;

1. DIR (pi, pj, pk)

             return (pk - pi) * (pj - pi);


// 判断 pk 是否在以pi, pj 为对角线的矩形内;

2. ON_POLYGON (pi, pj, pk)

       if min(xi, xj) <= xk <= max(xi, xj) and min(yi, yj) <= yk <= max(yi, yj)

               return TRUE;

       else  return FALSE;


//  by 我执可破.  2016.10.23 于上海浦东.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值