扫描线算法-求线段交点数量

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


将所有线段的左右端点以X坐标升序放入顶点优先队列中,然后初始化扫描线链表(查找二叉树)

依次取出顶点优先队列中的点,

1 左端点:将其线段插入到扫描线链表中,按照y的升序排列链表,找到在此线段上面相邻和下面相邻的线段,并依次计算此线段与其上面线段的交点,和此线段与其下面线段的交点,如果有交点,并且顶点队列中没有出现过,插入到顶点优先队列中;

2 右端点:将其线段从扫描线队列中删除,计算此线段上面相邻的线段与下面相邻的线段的交点,如果有交点,并且没有在顶点队列出现过,将交点插入到顶点优先队列中

3 交点:输出该交点,交换此交点所属的两条线段的位置,并分别计算这两条线段与他们的相邻线段的交点,插入的顶点优先队列中


(n+k)logn  

k为交点数目,n为线段数量


计算几何学:线段扫描线算法(改进版) 在上一篇博客中我初步实现了扫描线算法,但是经检验,法线存在不少的交点是不能够被检测到的。本周我对于上一篇博客中实现的算法进行了详细的分析,找到了算法失效的原因,并实现了改进版,在新的改进版中没有致命的逻辑错误,但是因为我使用的是浮点数,并且在处理过程中引入了一些误差,在某些非常特殊的情况下,算法可能会失效,但在大部分情况下算法都是能准确的找出交点的。 首先分析以下上一篇博客中实现的算法失效原因进行分析: 该扫描线算法需要两个数据结构:优先队列和搜索树。搜索树中储存目前和扫描线的所有线段,并且这些线段 阅读详情

相关推荐

计算几何2:扫描线线段算法

相比于上一篇中介绍的凸包算法,本次介绍的扫描线线段算法的实现难度明显更高,实际上最终本人也未能完美的实现该算法,下面给出的版本经测试是存在一些问题的。 首先介绍一下扫描线算法的基本原理,具体内容的讲解可以参考下面的链接: 链接: link. 实现该算法的主要障碍在于对三种不同事件点的处理:线段上端点、线段下端点、线段交点。 下面介绍一下对于这三种事件点的处理方式: 在线段上端点需要在查询树种引入一条新的线段,故此需要找到该新线段的左右邻居,并检查新插入的线段与其左右邻居是否存在交点。 在线段的下端点需

weixin_44800504的博客 1939

线扫描算法所有线段交点演示

软件有GUI显示,可以一次执行完,也可以单步执行,以显示算法过程. -- 很抱歉, 这个软件有问题. 今天看到大家的评论才自己重新下了下来, 原来软件的运行仍然需要编译环境. 下次一定更正.

线段树详解 (原理,实现与应用)

线段树详解 By 岩之痕 一:综述 线段树是一种可以快速进行区间修改和区间查询的数据结构。点修改,区间修改和区间查询的复杂度都是O(log2(n)) 并且,线段树可以维护很多种类的信息。说到线段树就不得不提一下树状数组,树状数组维护的信息必须满足区间减法,因为树状数组只是维护1到X的信息,通过相减来得到区间信息,代码简单而且速度快,占用空间又少于线段树,所以一般情况下可以用树状数组的地方就

岩之痕 14万+

基于扫描线线段算法 (2013年)

本文以基于扫描线算法线段交点,首先设有一条扫描线l,从高于所有线段的位置起,自上而下地扫描整个平面,与当前扫描线线段构成一个扫描线状态结构,在扫描线从上个事件点移到下个事件点时,要根据事件点的不同来更新扫描线的状态结构。该算法能避免盲目时大量无效测试。

C#:实现扫描线算法​(附完整源码)

C#:实现扫描线算法​(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 723

多边形填充算法-有序边表法(扫描线算法) 计算机图形学

1.算法的基本思想(扫描线连贯性原理):   对于一个给定的多边形,用一组水平(垂直)的扫描线进行扫描,对每一条扫描线均可出与多边形边的交点,这些交点扫描线分割成落在多边形内部的线段和落在多边形外部的线段;并且二者相间排列。于是,将落在多边形内部的线段上的所有象素点赋以给定的色彩值。 算法中不需要检验每一个象素点,而只考虑与多边形边相交点分割后的扫描线段。 2.算法解: ...

stupidmule的博客 1489

C#快速扫描线算法——取倾斜四边形与图片像素点叠区域

1.问题简要说明: a.图片的像素点大小为1×1的小矩形,以图片左下角为坐标原点,建立图片的直角坐标系 b.四边形的左下点在Y轴上半轴任意位置,宽为Width(>100),高为Height(>10),且与X轴有负小角度夹角( 问题: 取四边形所影响的像素点,及影响大小(四边形完全覆盖像素点时,定义影响大小为1) 2.快速扫描算法 a.传统扫描算法C#) 1)根据四边形左下顶点的坐

Eco-dream‘s CODE World 2514

线段交点检测:扫描线算法

几何对象的相检测是计算几何中的一项基本操作。七条线段问题实例。

新缸中之脑 2553

C/C++ line segment intersection线段(交点)算法详解及源码

线段问题是计算两条线段是否相,并交点的问题。线段由两个端点确定,我们需要判断两个线段是否有交点,并且交点的坐标。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 3330

扫描线算法

背景 之前看到洛谷管理员大佬发明了个二次分块,然后就想学学,发现扫描线是个前置知识,于是来肝这个算法了,发现其实不难。 进入正题 扫描线一个很经典的例题:在坐标轴上有若干个矩形,问他们覆盖的面积总和。 因为他们覆盖的面积有重复,于是就用到了神奇的扫描线算法。 假设有两个矩形,如图: 先来看一道例题:题目大意, ...

a_forever_dream的博客 2万+

多边形之间相交点算法_计算几何-线段集的所有交点

问题描述给定N条线段,计算这些线段彼此之间的所有交点。Bentley Ottmann Algorithm算法的前提假设:a) 不存在两条线段的终点和交点有相同的x坐标;b) 不存在多于两条的线段于一点;c) 不存在两条线段完全相互重叠;关键的观察结论:a) 两条相线段必然是相邻近的;b) 两条线段后,会换位置,在上面的线段在经过交点后,会到另一条线段的下面;扫描线算法的Events所...

weixin_39779528的博客 1400

计算几何扫描线算法sweep─line算法C++代码实现(CGAL实现的例子)

基于计算几何算法库实现的Sweep-line算法,能够报告直线的交点(CGAL实现的例子)

平面扫描算法:高效计算线段交点的C++实现详解

平面扫描算法是计算几何中的经典算法,通过巧妙的扫描线思想和高效的数据结构,成功将线段交点问题的时间复杂度从O(n²)优化到O((n+k)log n)。本文详细解析了算法的C++实现,包括关键的数据结构设计和算法流程。扫描线范式:将二维几何问题转化为一维序列处理问题事件驱动:通过事件点来驱动算法流程,有序处理几何变化状态维护:动态维护与扫描线线段集合相邻检测:只在状态结构中相邻的线段之间检测新交点平衡数据结构:使用AVL树保证所有操作的高效性。

C++方向学习笔记 1032

【解题报告】POJ1151 扫描线+线段树(矩形并)

先贴题目链接吧:http://poj.org/problem?id=1151 今年刚参加完蓝桥杯,第十题就是一道扫描线矩形面积并的问题,当时还没学习扫描线,有思路但是不会实现,于是花了两天时间好好的学习了一下扫描线。在网上找到了这道,可以说非常经典,也是非常基础的扫描线做法。 先说思路,对于矩形并问题,最直接的想法肯定是先把所有的面积加起来,然后减去重复的面积。但是这样做,当矩形数量增多,

Desico的博客 1221

扫描线算法笔记(C++)

本文介绍扫描线算法, 通过图解和代码帮助读者理解.

一些C++相关的技术笔记或者教程. 1720

【详解】线段扫描线

题目 「VOJ1056」图形面积 桌面上放了NNN个平行于坐标轴的矩形,这NNN个矩形可能有互相覆盖的部分,它们组成的图形的面积。 【输入】 有多组测试数据。 每组测试数据输入第一行为一个数NNN,表示矩形的数量。 下面NNN行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–108–10^8–108到10810^8108之间的整数。 当N==0N==0N==0时,测试文件结束...

_BOSS_的博客 1073

CodeForces1401 E.Divide Square(扫描线线段树)

题意: 有一个1e6*1e6的二维坐标平面, 左下角为(0,0),右上角为(1e6,1e6), 给定n条横线段,和m条竖线段, 问将平面分割成多少块区域。 数据范围:n,m<=1e5 解法: 如果不存在一条线段直接将正方形切切割成两份的情况,那么答案就是交点数量+1 如果存在直接切割的情况,每有一条答案+1,这个特判一下就行了. 关键在于如何交点数量: 用线段扫描线的思想,将线段拆分为修改和询问. 用竖着的扫描线从x=0向右扫: 1.遇到横线的左端点就加入线段树, 2.遇到横线的右端点就消除,

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 363

[算法] 线段树、离散化、扫描线重叠矩形面积

例1. [2019 美团春招实习笔试] 2. 染色格子数量 时间限制:C/C++语言 1000MS;其他语言 3000MS内存限制:C/C++语言 65536KB;其他语言 589824KB题目描述:在二维平面上有一个无限的网格图形,初始状态下,所有的格子都是空白的。现在有n个操作,每个操作是选择一行或一列,并在这行或这列上选择两个端点网格,把以这两个网格为端点的区间内的所有网格染黑(包含这...

weixin_30340353的博客 490

扫描线填充算法(DDA应用)

活动边表扫描线

闪电彬彬的博客 2669
上一篇: 寻找质数
下一篇: 概率和为1
sunmenggmail
博客等级 码龄17年 955粉丝 302原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值