矢量

如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2

矢量的加减

设二维矢量 P = (x1, y1), Q = (x2, y2),则 P + Q = (x1 + x2, y1 + y2), P -Q = (x1 - x2, y1 - y2),且有 P + Q = Q + P, P - Q = -(Q - P)

矢量叉积

设矢量 P = (x1, y1), Q = (x2, y2),则 P * Q = x1 * y2 - x2 * y1; 其结果是一个由(0, 0), P, Q, P + Q 所组成的平行四边形的 带符号的面积,P * Q = -(Q * P), P * (- Q) =-(P * Q)

叉积的一个非常重要的性质是可以通过它的符号来判断两矢量相互之间的顺逆时针关系:

若 P * Q > 0,则 P 在 Q 的顺时针方向

若 P * Q < 0, 则 P 在 Q 的逆时针方向

若 P * Q = 0,则 P 与 Q 共线,但不确定 P, Q 的方向是否相同

折线段的拐向判断

如图,假设有折线段 p0p1p2 ,要确定 p1p2 相对于 p0p1 是向左拐还是向右拐,可以通过计算(p2 - p0)*(p1 -p0) 的符号来确定折线的拐向(点 p2 - p0 实际上就是向量 p2,但这里要注意线段和矢量的区别)

判断点是否在线段上

设点 Q = (x, y), P1 = (x1, y1), P2 = (x2, y2),若 (Q - P1)*(P2 - P1) =0 且 min(x1, x2) <= x <= max(x1, x2) && min(y1, y2)<= y <= max(y1, y2),则点 Q 在线段 P1P2 上

判断两线段是否相交

1)快速排斥试验

设以线段 P1P2 为对角线的矩形为 R,设以线段 Q1Q2 为对角线的矩形为 T,若 R、T 不相交,则两线段不可能相交

假设 P1 = (x1, y1), P2 = (x2, y2), Q1 = (x3, y3), Q2 = (x4, y4),设矩形 R的 x 坐标的最小边界为 minRX = min(x1, x2),以此类推,将矩形表示为 R = (minRX, minRY,maxRX, maxRY) 的形式,若两矩形相交,则相交的部分构成了一个新的矩形 F,如图所示,我们可以知道 F 的 minFX =max(minRX, minTX), minFY = max(minRY, minTY), maxFX = min(maxRX,maxTX), maxFY = min(maxRY, maxTX),得到 F 的各个值之后,只要判断矩形 F 是否成立就知道 R 和T 到底有没有相交了,若 minFX > maxFX 或 minFY > maxFy 则 F 无法构成,RT不相交,否则RT相交

2)跨立试验

若 P1P2 跨立 Q1Q2,则 P1,P2 分别在 Q1Q2 所在直线的两端,则有 (P1 - Q1)*(Q2 - Q1) *(Q2 - Q1)*(P2 - Q1) > 0,当 (P1 - Q1)*(Q2 - Q1) = 0 时,说明 (P1 - Q1)与 (Q2 - Q1) 共线,但由于已经经过快速排斥试验,所以 Q1 必为 P1P2 与 Q1Q2的交点,依然满足线段相交的条件,则跨立试验可改为:

当 (P1 - Q1)*(Q2 - Q1) * (Q2 - Q1)*(P2 - Q1) >= 0,则 P1P2 跨立Q1Q2,当 Q1Q2 也跨立 P1P2 的时候,则 P1P2 相交

(注意式子中被隔开的 * 代表两个叉积的值的相乘,而另外的两个 * 则代表计算矢量叉积)

转自:http://blog.sina.com.cn/s/blog_71dbfe2e0101f7zb.html

判断线段是否相交:快速排斥+跨立相关推荐

  1. [GIS算法] 判断两线段是否相交的四种方案(快速排斥+跨立实验、参数方程求解、凸多边形、点在线的哪一侧)-附C语言实现

    文章目录 算法一:快速排斥+跨立试验 代码 算法二:参数方程求解 代码 算法三:凸多边形 算法四:点在线的哪一侧 算法一:快速排斥+跨立试验 重点掌握 [原理]利用矢量的叉乘 [图解] 代码 #def ...

  2. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  3. java判断线段是否相交函数_计算几何-判断线段是否相交

    计算几何-判断线段相交 判断两线段是否相交: 快速排斥 跨立实验(这两个词也是我看博客的时候看到的,觉得挺高大上的就拿过来用了,哈哈哈) 1. 快速排斥:就是初步的判断一下,两条线段是不是相交,以两条 ...

  4. 跨立实验判断线段是否相交-POJ3304

    在二维坐标下介绍一些定义: 点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y ); 向量的模 |AB| = sqrt ( x*x+y ...

  5. 判断点在线段的左边还是右边 判断线段是否相交

    在recast中遇到的一个操作,判断点是在线段的左边还是右边 判断在左边和右边在很多场景都有用到,是计算机几何中比较基础的概念.比如判断是凹多边形还是凸多边形:判断点是凹点还是凸点:判断线段是否相交: ...

  6. Ray-AABB问题:判断线段是否相交于轴对齐边界框(Axially Aligned Bounding Box, AABB)

    摘要 Ray-AABB问题:判断线段是否相交于轴对齐边界框(Axially Aligned Bounding Box, AABB) 本文介绍了slab算法的实现,从一个简单实现开始,逐步优化slab算 ...

  7. 快速排斥、跨立实验判断线段是否相交

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

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

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

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

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

最新文章

  1. 老大吩咐的可重入分布式锁,终于完美的实现了~
  2. django 完整日志配置
  3. 精华阅读第6期|程序猿的世界,你不懂!
  4. 数字图像处理 直方图规定化 MATLAB实验
  5. python程序异常实例_Python werkzeug.exceptions方法代码示例
  6. linux脚本done报错,很简单的脚本程序,总是报错
  7. Cannot get a connection, pool exhausted, cause: ValidateObject failed
  8. phpmyadmin设置自动登录和取消自动登录
  9. 下载devc++和codeblocks记录
  10. 布莱克曼哈尔窗matlab,基于matlab的布莱克曼窗函数法设计的低通滤波器
  11. Java 生成数字证书系列(三)生成数字证书
  12. golang it营_深入理解Go-垃圾回收机制
  13. YOLO数据格式说明与转换
  14. Tensorflow2.0学习-Keras Tuner 妙用 (六)
  15. HTML-做一个网页的注册登记表单
  16. NodeRed基础1--循环结构
  17. oracle数据库归档模式修改ARCHIVELOG
  18. 如何治好自己的选择恐惧症
  19. 声卡自动修补appleHDA,支持AMD平台
  20. 以太网远程MQTT IO模块在IIOT工业物联网项目中的应用

热门文章

  1. Ubuntu20.04 系统使用罗技B525摄像头
  2. 当 Erda 遇上 API 生命周期管理,好戏开始了!
  3. Essential C++复习笔记(1)
  4. 新加坡联合早报的评论
  5. android 调用go静态库,CGO,GOLANG调用C库,调用代码、静态库或动态库
  6. 使用opengl绘制立方体_opengl基本流程
  7. 职场小故事,工作大道理之动物王国(12)
  8. windows主机查询产品号和主机序列号
  9. Mysql中千万数据查询浅析
  10. 【报错】打包不成功没因为TEST文件