清华计算几何-线段求交与BO算法

单轴线段求交

给定单边轴下, N定线段,检查出相交的线段.

解法一: 暴力求解

遍历所有线段对,进行相交判断, 算法复杂度为O(n2)

解法二: LR扫描

把每条线段的头尾认定为L和R。对所有点进行排序,如果每两个点满足LL或者RR,则对应的线段相交。如果为LR,则对应的线段无相交,算法复杂度为O(nlog(n))

多轴线段求交 - BO算法(line sweep)

上面强调是单个坐标轴的线段求交,扩展到XY轴甚至更多轴.

比较常用的算法有 bentley--ottmann algorithm, 简称BO算法。

利用扫描线进行求交的算法.

算法复杂度: O((n + I) * logn)

空间: O(n + I)

N为线段总数, I为线段交点.

扫描线相交线的垂直排序(从上到下)

扫描线为垂直线, 自左向右扫描, 在x = t时刻, 扫描线与多条线段相交, 按照相交点的高度从上往下排序, 在最上面交点所在的线段顺序最高,然后依次往下降低。

事件点和扫描线移动导致垂直排序变化(从左到右)

随着扫描线的移动,假设原来线段A的顺序高于线段B,但是经过某些关键点变化,他们的相对顺序会颠倒。这些点成为事件(Event)

扫描线移动的时候导致垂直排序发生改变的三个关键时间点:

[1]线段左端点

[2]两条线段相交点

[3]线段右端点

BO算法使用的数据结构

前面说到BO算法由扫描线从左向右扫描, 扫描线时刻会和某部分线段产生相交事件(左右端点 + 相交事件), 而多条线段之间又存在高度之间的顺序排列以及顺序变化。

EventQueue

从左到右经过线段的左右端点和相交点都为事件点。

优先队列

Status Struct

和扫描线X = t正在相交的线段,进行上下维度的高度排序

平衡二叉树

扫描线从左到右扫描线段的三种情况

扫描线进行扫描的EventQueue案例

扫描线相交线段上下维度的StatusStruct变化的案例

(线段左端点,右端点,和相交事件)三种事件下StatusStruct都会产生变化,BBST(平衡二叉树)实现其中的删减和重新排序

BO算法中判断线段相交是前面线段三类事件决定的结果--案例

其中f和e相交就是线段P右端点引发的事件后果.(三类事件中的第二类事件)

BO算法特殊情况下效率低下--重复测试

参考资料

[1] 清华计算几何 P66 - P82

相关推荐
TANGLONG2225 小时前
【C++】继承详解——基类/派生类、作用域、默认函数、菱形继承(超详细)
java·c语言·c++·经验分享·笔记·ajax
木木_王6 小时前
嵌入式学习 | STM32裸板驱动开发(Day01)入门学习笔记(超详细完整版|点灯实验 + 库函数代码 + 原理全解)
linux·驱动开发·笔记·stm32·学习
largecode6 小时前
能不能让座机号码显示“XX公司”那样的认证名称?申请号码认证方法
经验分享·笔记·音视频·课程设计·oneapi·segmentfault·微信开放平台
Hua-Jay6 小时前
OpenCV联合C++/Qt 学习笔记(十七)----凸包检测、直线检测及点集拟合
c++·笔记·qt·opencv·学习·计算机视觉
是喵斯特ya7 小时前
红日内网靶场1环境搭建
笔记
中屹指纹浏览器7 小时前
2026浏览器插件扩展安全风险溯源与环境隔离防护规范
经验分享·笔记
宵时待雨7 小时前
回溯算法专题1:递归
数据结构·c++·笔记·算法·leetcode·深度优先
今儿敲了吗8 小时前
面向对象(三)——设计模式
笔记·设计模式
是喵斯特ya8 小时前
红日内网靶场1渗透笔记
笔记·安全
一只机电自动化菜鸟8 小时前
一建机电备考笔记(34)焊接技术(设备与材料1)(含考频+题型)
笔记·学习·职场和发展·生活·学习方法