清华计算几何-线段求交与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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409122.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式UI开发-lvgl+wsl2+vscode系列:11、SSD202移植运行评估demo程序

一、前言 接下来我们根据开发板的LVGL指南移植lvgl的demo程序到开发板上,以及将一个评估的项目移植到开发板上,你将会发现移植lvgl到ssd2xx的板子上似乎很简单,但通过评估程序你将更加方便了解lvgl是否可以满足你的开发需求,除了…

使用了LSTM的数据预测

记录一下,这个是在national university of singapore,黄教授给我们布置的任务,做了一个北京的已知十年的打印量,预测100天的打印机大作业,我们使用了lstm模型,就是两层神经网络,同时dropout的加入为了防止过…

k8s跨节点后pod无法访问

场景 k8s在node1节点部署nginx后, 除node1外,主节点以及node2节点都无法正常访问nginx 并且主节点以及node2节点都无法ping通node1节点上的pod 网络插件为calico 并且也没有相关路由信息 解决方案 启动tunl0接口,因为calico需要使用tunl0网…

【解析几何笔记】8.向量的投影与内积

8. 向量的投影与内积 复习前面的知识:,若BCE三点共线,则 A E ⃗ ( 1 − s ) A B ⃗ s A C ⃗ , ( B , C , E ) μ ⇒ s μ 1 μ , 1 − s 1 1 μ \vec{AE}(1-s)\vec{AB}s\vec{AC},(B,C,E)\mu\Rightarrow s\frac{\mu}{1\mu},1-s\frac…

【学习笔记】时间序列模型(ARIMA)

文章目录 前言一、时间序列时间序列数据 二、ARIMA 模型大纲模型前提平稳性检验 差分整合移动平均自回归模型 ARIMA(p,q,d)自回归模型 (AR( p ))移动平均模型 (MA( q ))自回归移动平均模型(ARMA(p,q))差分自回归移动平均模型 ARIMA(p,d,q) 确定 p,q结果分析和模型检…

EVE-NG安装部署使用

EVE-NG安装部署使用 一、EVE的虚拟化安装1、下载EVE-NG(社区版)2、导入虚拟机-配置-登录二、EVE中设备的连接sercureCRT连接wireshark连接一、EVE的虚拟化安装 1、下载EVE-NG(社区版) 官网下载地址(科学上网): https://www.eve-ng.net/index.php/download/ 中文网下载…

运用Archimate为 智慧文旅搭建 数字化架构体系【系统架构】

ArchiMate是一种用于企业架构建模的开放、独立且详细的语言,它提供了一套丰富的概念和关系来描述、分析和可视化企业架构的不同领域。以下是ArchiMate建模的一些关键功能: 多视图建模:ArchiMate定义了23个示例视图,分为四类&#…

VMware-Ubuntu共享文件找不到

正常的流程我们实现设置共享目录 然后安装vmware-tool工具 我们先看一下vmware-tool的获取方式,系统安装好了以后,关闭系统将虚拟机设置改成图中配置,然后重启 鼠标右键会看到重新安装vmware-tool不再是灰色,点击重新安装 以1…

OpenCV几何图像变换(5)旋转和缩放计算函数getRotationMatrix2D()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算二维旋转的仿射矩阵。 该函数计算以下矩阵: [ α β ( 1 − α ) ⋅ center.x − β ⋅ center.y − β α β ⋅ center.x ( …

【TB作品】MSP430F149单片机,数字时钟万年历程序,滚动显示特效

一、 万年历 任务要求: 制作一个万年历,具有显示时间、日期、温度、湿度、闹钟功能。 1、OLED显示屏上显示日期和时钟(显示到秒,时间可走动);(20分) 2、通过开发板上的温度传感器采集…

8月25日笔记

IOX的使用 iox是一款功能强大的端口转发&内网代理工具,该工具的功能类似于lcx和ew,但是iox的功能和性能都更加强大。 实际上,lcx和ew都是非常优秀的工具,但还是有地方可以提升的。在一开始使用这些工具的一段时间里&#xff…

前端常见**MS题 [3]

css部分 1、简单说明一下盒模型 CSS盒模型定义了盒的每个部分包含: margin, border, padding, content 。根据盒子大小的计算方式不同盒模型分成了两种,标准盒模型和怪异盒模型。 标准模型,给盒设置 width 和 height,实际设置的是…

C语言 | Leetcode C语言题解之第373题查找和最小的K对数字

题目&#xff1a; 题解&#xff1a; #define MIN(a, b) ((a) > (b) ? (b) : (a))int** kSmallestPairs(int* nums1, int nums1Size, int* nums2, int nums2Size, int k, int* returnSize, int** returnColumnSizes) {if (nums1Size 0 || nums2Size 0 || k < 0) {*ret…

Gerapy 分布式爬虫管理框架

什么是 Gerapy Gerapy 是一个基于 Scrapy 的分布式爬虫管理框架。它提供了一个图形化的用户界面&#xff0c;使得用户可以更方便地进行 Scrapy 项目的管理和调度。Gerapy 支持项目的创建、编辑、部署以及调度任务的管理。 功能作用 项目管理&#xff1a;Gerapy 允许用户通过 W…

数据结构系列-归并排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 归并排序 递归版本 首先&#xff0c;我们来看一下归并的示意图&#xff1a; 这是归并排序当中分解的过程。 然后便是两个两个进行排序&#xff0c;组合的过程。 归并完美的诠释…

C++类和对象(2)——拷贝构造函数

拷贝构造函数的语法 拷贝构造函数是构造函数的重载&#xff0c; 用于这种情况&#xff1a;用已经构造好的对象去给另一个对象初始化。 int main() {Date d1(2024, 8, 1);Date d2(d1);//用d1初始化d2return 0; } 我们以Date类为例子讲解一下。 class Date { public://全缺省…

【计算机网络】计算机网络的概念

什么是计算机网络&#xff1f; 计算机网络&#xff08;Computer networking&#xff09;是一个将众多分散的、自治的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 计算机网络、互连网、互联网的区别 计算机…

OpenCV几何图像变换(4)亚像素图像截取函数getRectSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从图像中以亚像素精度检索像素矩形。 getRectSubPix 函数从 src 中提取像素&#xff1a; p a t c h ( x , y ) s r c ( x center.x − ( dst.…

指针之旅(1)—— 指针基础概念知识(详细解析)

前言&#xff1a;该篇我将详细讲解指针当中的一些基本概念&#xff0c;有内存和地址的部分硬件知识&#xff0c;有专门服务于指针的操作符&和*&#xff0c;有指针大小固定不变的原因&#xff0c;还有专属于指针的运算规则。 目录 1. 内存和地址 1.1 内存地址的概念&…

<数据集>非洲动物识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1504张 标注数量(xml文件个数)&#xff1a;1504 标注数量(txt文件个数)&#xff1a;1504 标注类别数&#xff1a;4 标注类别名称&#xff1a;[buffalo, elephant, rhino, zebra] 序号类别名称图片数框数1buffalo3…