线段交叉判断(快速排斥实验 + 跨立实验)
第1 步:快速排斥试验,如果分别以P1P2 ,P3P4 为对角线做矩形,而这两个矩形不相交,则这两条线段肯定不相交,如下左图;即使两个矩形相交,这两条线段也不一定相交,如下右图,这时再用第2 步判断;
表示成语句,即两个矩形相交当且仅当下列式子为真:
(max(x1,x2)≥min(x3,x4))∧ (max(x3,x4)≥min(x1,x2)) ∧(max(y1,y2)≥min(y3,y4))∧(max(y3,y4)≥min(y1,y2))
两个矩形相交必须在两个方向上都相交,式子的前半部分判断在x 方向上是否相交,后半部分判断在y 方向上是否相交。
第2 步:确定每条线段是否“跨立”另一条线段所在的直线。
跨立:如果点P1 处于直线P3P4的一边,而P2处于该直线的另一边,则我们说线段p1p2跨立直线P3P4,如果P1 或P2 在直线P3P4 上,也算跨立。
两条线段相交当且仅当它们能够通过第1 步的快速排斥试验,并且每一条线段都跨立另一条线段所在的直线。
具体第2 步的实现,只要用叉积去做就可以了,即只要判断矢量p1p3和p1p4是否在p1p2的两边相对的位置上,如果这样,则线段p1p2跨立直线P3P4。也即检查叉积(P3-P1)×(P2-P1)与(P4-P1)×(P2-P1)的符号是否相同,相同则不跨立,线段也就不相交,否则相交。
当然也有一些特殊情况需要处理,如任何一个叉积为0,则P3 或P4 在直线P1P2 上,又因为通过了快速排斥试验,所以下图左边的情况是不可能出现的,只会出现右边的两种情况。当然,还会出现一条或两条线段的长度为0,如果两条线段的长度都是0,则只要通过快速排斥试验就能确定;如果仅有一条线段的长度为0,如p3p4的长度为0,则线段相交当且仅当叉积(P3-P1)×(P2-P1)。
有关于叉积的概念:
矢量的矢量积(叉乘、叉积)
① 矢量积的一般含义:两个矢量a 和b 的矢量积是一个矢量,记作a×b,其模等于由a 和b作成的平行四边形的面积,方向与平行四边形所在平面垂直,当站在这个方向观察时,a 逆时针转过一个小于π的角到达b 的方向。这个方向也可以用物理上的右手螺旋定则判断:右手四指弯向由A 转到B 的方向(转过的角小于π),拇指指向的就是矢量积的方向。如下图(左)。
② 我们给出叉积的等价而更有用的定义,把叉积定义为一个矩阵的行列式:
如上右图,如果 p1 × p2 为正数,则相对原点(0,0)来说, p1 在p 2 的顺时针方向; 如果p 1 × p2为负数,则p 1 在p 2 的逆时针方向。如果p 1× p2 =0,则p 1和p 2 模相等且共线,方向相同或相反。
③ 给定两个矢量:P0P1和P0P2,对它们的公共端点P0来说,判断P0P1是否在P0P2的顺时针方向。
方法:如上图,把0 p 作为原点,得出向量P1’=P1-P0 和P2’=P2-P0,因此,这两个向量的叉积为: 如果该叉积为正,则P0P1在P0P2的顺时针方向,如果为负,则P0P1在P0P2的逆时针方向。如果等于0,则P0,P1,P2三点共线。
④ 讨论另一个重要问题:确定连续线段是向左转还是向右转,如下图,即两条连续线段P0P1
和P1P2在点P1 是向左转还是向右转。也即∠P1P0P2的转向。
方法:叉积,同上。
线段交叉判断(快速排斥实验 + 跨立实验)相关推荐
- 判断两线段是否相交——快速排斥与跨立实验
如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...
- 计算几何_线段交点的快速排斥_跨立实验
附上题的地址 https://vjudge.net/problem/HDU-1086# // 点是否在矩形 // 矩形点是 st 和 ed bool IsPointInRectangle(Point ...
- 计算几何 快速排斥和跨立实验 判断两线段相交
线段P1P2, Q1Q2,判断其是否相交,通过快速排斥和跨立实验则说明相交 首先要知道:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的逆时针方向:若结果大于0,表示向量b在向量a的 ...
- 快速排斥、跨立实验判断线段是否相交
写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...
- 线段相交(快速排斥和跨立)
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 本来想用斜率来算,后来觉得要分太多情况,上网发现用快速排斥+ ...
- 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)
一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...
- 判断两个线段相交问题(快速排斥实验跨立实验)
代码实现: import numpy as np import cv2class Check_line():def __init__(self):passdef step_one(self, p1, ...
- 51nod 1264 线段相交(跨立实验)
51nod1264:线段相交 判断线段相交: 关于快速排斥和跨立实验的博客:https://blog.csdn.net/li1615882553/article/details/80372202 在快 ...
- [GIS算法] 判断两线段是否相交的四种方案(快速排斥+跨立实验、参数方程求解、凸多边形、点在线的哪一侧)-附C语言实现
文章目录 算法一:快速排斥+跨立试验 代码 算法二:参数方程求解 代码 算法三:凸多边形 算法四:点在线的哪一侧 算法一:快速排斥+跨立试验 重点掌握 [原理]利用矢量的叉乘 [图解] 代码 #def ...
最新文章
- 【需求工程】需求获取
- 数据中异常值的鉴定和处理(1)
- SQLServer组成:
- 每天进步一点点——Linux系统中的异常堆栈跟踪简单实现
- 网站后台开发 java_Java前后台开发
- H3C官方培训课件大全
- 城市应急管理系统技术方案
- Javascript --- 模板引擎
- python,执行pip报错:Fatal error in launcher: Unable to create process using ‘“D:\tools\python.exe“ (已解决)
- java扫雷初级代码_高分求一个运行在Eclipse环境下的java 扫雷游戏的初级代码 越小越好 越短越好 运行就好,就是初级就好了,...
- OCR表格识别——(二)
- Java企业汽车调度系统
- latex大括号公式编辑
- C# 导出Excel解决Cannot get a text value from a numeric cell或者Cannot get a numeric value from a text cell
- 6个越南主流社交媒体软件简单介绍
- 【一个王朝的背影】--余秋雨
- 3D车道线检测能否成为自动驾驶的核心?盘一盘近三年的SOTA论文!
- solidity 入门
- Win10家庭版打开组策略方式
- excel高级筛选怎么用_如何用excel在筛选状态下怎么复制粘贴?
热门文章
- 连载三 奖学金文章更新 张文军 北京IOS第38期学员
- 最失败的项目管理 zz
- html 单选 radio使用,html radio单选按钮JS脚本控制
- Java Swing教程_v20210204
- PyTorch中 tensor.detach() 和 tensor.data 的区别
- Activity猫的一生-故事解说Activity生命周期
- SecureCRT--解决Key exchange failed.No compatible key-exchange method
- UE4-(蓝图)第二十五课音频的播放
- 熊抱烧香源码c语言,李栋旭后台熊抱灿烈“亲密”耳语 显真情
- (十一)XML 文件解析以及工具实现(详解)