计算几何——快速排斥实验和跨立实验
两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的。
也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上差别不大)。
在判断两条线段是否相交时,我们常用快速排斥实验跟跨立实验这两种方法,快速排斥实验能很快的排除掉线段不相交的情况,但并没法成为线段相交的充要条件,在快速排斥实验之后接上跨立实验就能完全的判断两线段是否相交,但其实只用跨立实验这一种办法也能作为判断线段相交的充要条件。
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
计算几何——快速排斥实验和跨立实验相关推荐
- caioj1212:【计算几何】判断线段相交(快速排斥判断与跨立实验)
首先,欢迎大家来访问我老师的OJ:小白菜OJ 你是新入门OI的小白吗? 你正在苦于网上的资料不足吗? 你正在因各种blog写得不清不楚.艰涩难懂.千篇一律.满篇术语像LB一样而烦恼吗? 欢迎来到小白菜 ...
- POJ1410线段相交、快速排斥实验、跨立实验
题目 Intersection 给出二维平面中一条线段和一个矩形,问线段和矩形是否有交点,矩形包括边和内部. 解题思路 先判断线段和四条边是否相交,如果没交点,再继续判断线段是否在矩形内. 判断线段相 ...
- 快速排斥实验amp;跨立实验 判断两直线是否相交
两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的. 也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上 ...
- 计算几何--快速排斥实验和跨立实验
1.快速排序实验 两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的.快速排斥实验能很快的排除掉线段不相交的情况,但并没法成为线段相交的充要条件,在快速排斥实验之后 ...
- 【计算几何】快速排斥实验和跨立实验
1.快速排序实验 两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的.快速排斥实验能很快的排除掉线段不相交的情况,但并没法成为线段相交的充要条件,在快速排斥实验之后 ...
- 快速排斥实验和跨立实验
矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2 矢量的加减 设二维矢量 P = (x1, y1), Q = ...
- 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)
一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...
- POJ - 1269 Intersecting Lines(计算几何 + 叉积 + 跨立实验)
链接 Intersecting Lines 题意 给出两条线段,判断是否共线,平行,或者相交,如果相交输出交点: 思路 如何判断共线: 我们知道两个向量叉积为 000,两向量共线: 所以我们只需要判断 ...
- 计算几何_线段交点的快速排斥_跨立实验
附上题的地址 https://vjudge.net/problem/HDU-1086# // 点是否在矩形 // 矩形点是 st 和 ed bool IsPointInRectangle(Point ...
最新文章
- 没有地图也能导航?DeepMind用街景来认路
- java源码保护技术,sourceguard
- STM32 USART1 USART2 UASRT3 UART4 UART5串口通信测试程序
- Java StringBuffer 方法
- 将状态机模式实现为流处理器
- 链上存证、链下传输的可信数据共享平台
- javascript 小结
- Replication--复制延迟的诊断和解决
- 使用Maven构建Web项目-测试
- 10 -3 2用c语言怎么打,(3*20+30-10)/2怎么使用C语言编写
- 主线程中慎用WaitForSingleObject (WaitForMultipleObjects)
- 海康威视研究院ImageNet2016竞赛经验分享
- [BZOJ] 1040: [ZJOI2008]骑士
- HDU2044 一只小蜜蜂...
- 【精华】多目标跟踪MOT
- 校园车辆管理系统的设计与实现(论文+源码)_kaic
- C语言基本语法——循环篇(三种常见的循环)
- 导出Fbx和obj的工具
- 有MDF文件和LDF文件之后怎么创建数据库
- 首次申请测绘资质需要提交哪些材料?