维诺图(Voronoi Diagram)

定义:
平面中一堆点,每个点有自己的领域,领域中任意位置到这个基点的距离都要小于到其他点的距离(很自然想到垂直平分线、抛物线)
维诺图本身是根据n个基点构造的,结果中最多3n-6条边,最多2n-5个顶点,是线性的

复杂度:

扫描线算法:是一种基于排序的算法,类比可得,最低时间复杂度O(NlogN)

扫描线算法流程:空间O(N)
扫描线从图像的一边到另一边(假设为从上到下)
扫描线会在遇到(扫描到)某个点(event point)时触发事件
对于维诺图,提出海岸线(beach line),海岸线的每条弧都是抛物线线
海岸线处于上方点和下方平直的扫描线中央,绝对意义的中间:海岸线上任意一点到已经扫描的点中最近那个点的距离与到海岸线(垂线)的距离是一样的
海岸线的提出是为了保证海岸线扫过的部分不会再改变,如果只用平直的一条扫描线,还会对扫描的部分进行维诺图修改。
海岸线的直观结果是每个扫描过的点和扫描线形成的抛物线的合并然后取最小的值(最低的部分)

事件触发:
基点事件(site event):水平的扫描线在前,当遇到event point的时候,触发事件:海岸线将出现一个新的弧,弧相交的断点(brakpoint)处(由1边2)维诺边发生分叉:推论:因此海岸线弧的数量不超过2 * n - 1。
圆事件( circle event):默认情况下随着扫描线的推移,海岸线中的某条弧收缩为一个点(随后衍生为维诺边),海岸线生成的维诺图边界将发生合并;题外话:对于弧线收缩为一个点(维诺顶点):这个点是它所在维诺图细胞核和两边细胞细胞核构成的圆的圆心,而这个圆是空圆。

海岸线(beach line)
海岸线的每条弧都是抛物线线
每个海岸线弧线对应一个事件队列中的事件
海岸线处于上方点和下方平直的扫描线中央,绝对意义的中间:海岸线上任意一点到已经扫描的点中最近那个点的距离与到海岸线(垂线)的距离是一样的
海岸线的提出是为了保证海岸线扫过的部分不会再改变,如果只用平直的一条扫描线,还会对扫描的部分进行维诺图修改。
海岸线的直观结果是每个扫描过的点和扫描线形成的抛物线的合并然后取最小的值(最低的部分)

考虑数据结构:
DCEL: 双向链连接表 doubly connected edge list
平衡二分查找树:存储海岸线,也就是status structure,每个叶子记录每个弧(同海岸线从左向右一一对应)(以及这个弧对应的基点),其他内部结点表示断点(存储基点对)
优先队列:用来存储事件队列(每个点的y坐标就是优先级)
邻接三元组:存储海岸线上相邻的三条弧

海岸线下移(y减小),每遇到一个基点,都可通过树logN找到其所在位置并加入
每个海岸线弧线对应一个事件队列中的事件
每个树内部节点对应一个DCEL边

退化情况:
扫描线上出现多个事件(边界:最初就有这种事情,某个上方将没有海岸线,要单独处理)
圆事件时候多个基点共圆,可以事后处理掉0长度的边(合并)
三个连续共线(扫描线)基点,永不会发生共线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值