两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的。

也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上差别不大)。

在判断两条线段是否相交时,我们常用快速排斥实验跟跨立实验这两种方法,快速排斥实验能很快的排除掉线段不相交的情况,但并没法成为线段相交的充要条件,在快速排斥实验之后接上跨立实验就能完全的判断两线段是否相交,但其实只用跨立实验这一种办法也能作为判断线段相交的充要条件。

1.快速排斥实验:

假设以线段P1,P2为对角线作一矩形R,再以Q1,Q2为对角线作矩形T,当两个矩形不相交的时候两条线段肯定不相交,即线段相交的必要条件时矩形相交。

P1坐标为(p1x,p1y),P2坐标为(p2x,p2y),Q1的坐标为(q1x,q1y),Q2的坐标为(q2x,q2y)。

那矩形相交的条件就是:

min(p1x,p2x) <= max(q1x,q2x) && min(q1x,q2x) <= max(p1x,p2x) && min(p1y,p2y) <= max(q1y,q2y) && min(q1y,q2y) <= max(p1y,p2y);

编程里只要写出min(int a,int b)跟max(int a,int b)这两个函数,再将上面的条件放进if() 语句就能初步确定线段有没有相交的可能性。

2.跨立实验:

如果一条线段P1P2跨过了线段Q1Q2,那么P1,P2就分布在线段Q1Q2的两边,那么((P1-Q1)×(Q2-Q1))*((Q2-Q1)×(P2-Q1))>0 【此为条件1】。注意“×”是叉乘的意思,而“*”才是点乘。

(P1-Q1)×(Q2-Q1)能得出线段Q1P1跟线段Q1Q2叉乘结果的向量的方向,(Q2-Q1)×(P2-Q1)同样也会得出线段Q1Q2和线段Q1P2叉乘结果的向量的方向,只有这两个结果向量的点乘结果大于0,即这两个结果向量的方向一致时,P1,P2才会分布在线段Q1Q2的两边。

同理Q1Q2分布在P1P2两边的条件为((Q1-P1)×(P2-P1))*((P2-P1)×(Q2-P1))>0【此为条件2】。

同时满足以上两个条件时,线段Q1Q2跟线段P1P2才会相交。(其实只要满足这一个实验,两线段相交情况就能确定了,不需要前面的快速排斥实验)

编程里将以上公式转化为坐标运算就可以了,这里附上叉积公式:a × b = (l,m,n) × (o,p,q) = (mq-np,no-lq,lp-mo)

因此条件1等价于:[(P1x-Q1x)*(Q2y-Q1y)-(P1y-Q1y)*( Q2x-Q1x)] * [(Q2x-Q1x)*(P2y-Q1y)-(Q2y-Q1y)*(P2x-Q1x)] > 0

条件2等价于:[(Q1x-P1x)*(P1y-P2y)-(Q1y-P1y)*( P2x-P1x)] * [(P2x-P1x)*(Q2y-P1y)-(P2y-P1y)*(Q2x-P1x)] > 0

将以上两个表达式写入if()语句即可判断线段相交与否。

注:上面两张图都不是自己画的,直接百度来的,算是盗图吧。

转载于:https://www.cnblogs.com/TangMoon/p/7611115.html

计算几何——快速排斥实验和跨立实验相关推荐

  1. caioj1212:【计算几何】判断线段相交(快速排斥判断与跨立实验)

    首先,欢迎大家来访问我老师的OJ:小白菜OJ 你是新入门OI的小白吗? 你正在苦于网上的资料不足吗? 你正在因各种blog写得不清不楚.艰涩难懂.千篇一律.满篇术语像LB一样而烦恼吗? 欢迎来到小白菜 ...

  2. POJ1410线段相交、快速排斥实验、跨立实验

    题目 Intersection 给出二维平面中一条线段和一个矩形,问线段和矩形是否有交点,矩形包括边和内部. 解题思路 先判断线段和四条边是否相交,如果没交点,再继续判断线段是否在矩形内. 判断线段相 ...

  3. 快速排斥实验amp;跨立实验 判断两直线是否相交

    两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的. 也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上 ...

  4. 计算几何--快速排斥实验和跨立实验

    1.快速排序实验 两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的.快速排斥实验能很快的排除掉线段不相交的情况,但并没法成为线段相交的充要条件,在快速排斥实验之后 ...

  5. 【计算几何】快速排斥实验和跨立实验

    1.快速排序实验 两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的.快速排斥实验能很快的排除掉线段不相交的情况,但并没法成为线段相交的充要条件,在快速排斥实验之后 ...

  6. 快速排斥实验和跨立实验

    矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2 矢量的加减 设二维矢量 P = (x1, y1), Q = ...

  7. 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)

    一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...

  8. POJ - 1269 Intersecting Lines(计算几何 + 叉积 + 跨立实验)

    链接 Intersecting Lines 题意 给出两条线段,判断是否共线,平行,或者相交,如果相交输出交点: 思路 如何判断共线: 我们知道两个向量叉积为 000,两向量共线: 所以我们只需要判断 ...

  9. 计算几何_线段交点的快速排斥_跨立实验

    附上题的地址 https://vjudge.net/problem/HDU-1086# // 点是否在矩形 // 矩形点是 st 和 ed bool IsPointInRectangle(Point ...

最新文章

  1. 没有地图也能导航?DeepMind用街景来认路
  2. java源码保护技术,sourceguard
  3. STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序
  4. Java StringBuffer 方法
  5. 将状态机模式实现为流处理器
  6. 链上存证、链下传输的可信数据共享平台
  7. javascript 小结
  8. Replication--复制延迟的诊断和解决
  9. 使用Maven构建Web项目-测试
  10. 10 -3 2用c语言怎么打,(3*20+30-10)/2怎么使用C语言编写
  11. 主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
  12. 海康威视研究院ImageNet2016竞赛经验分享
  13. [BZOJ] 1040: [ZJOI2008]骑士
  14. HDU2044 一只小蜜蜂...
  15. 【精华】多目标跟踪MOT
  16. 校园车辆管理系统的设计与实现(论文+源码)_kaic
  17. C语言基本语法——循环篇(三种常见的循环)
  18. 导出Fbx和obj的工具
  19. 有MDF文件和LDF文件之后怎么创建数据库
  20. 首次申请测绘资质需要提交哪些材料?

热门文章

  1. 怀旧服服务器维护重置稀有,怀旧服修复:副本每日30次重置的限制,改为针对每一个角色...
  2. 无法卸载mysql server 2008 r2_卸载Microsoft SQL Server 2008 R2 安装程序
  3. HTML radio的value属性 默认值为on
  4. textarea 的 resize 属性
  5. Cnetos7系统---文件压缩与解压命令详解。
  6. 怎样实现EDIUS中的视频快放的制作
  7. C语言实现简单的状态机
  8. 【初识C语言】第一篇
  9. Net-a-Porter Coach factory outlet
  10. Spanner论文理解