沃罗诺伊图(Voronoi):迷人的世界【1/2】

news2024/11/27 16:30:08

一、说明

         Voronoi图(也称为狄利克雷镶嵌泰森多边形)在自然界中无处不在。你已经遇到过他们数千次了,但也许没有这样称呼它。Voronoi图很简单,但它们具有令人难以置信的特性,在制图,生物学,计算机科学,统计学,考古学,一直到建筑和艺术等领域都有应用。

二、什么是沃罗诺伊图?

        假设您有 n 个点分散在一个平面上,这些点的 Voronoi 图将平面细分为正好 n 个单元格,这些单元格包围了最接近每个点的平面部分。这将产生完全覆盖平面的镶嵌。作为说明,在图 1 中,我绘制了 100 个随机点及其相应的 Voronoi 图。如您所见,每个点都包含在一个像元中,该像元的边界在两个或多个点之间正好等距。换句话说,单元格中包含的所有区域都最靠近单元格中的点,而不是任何其他点。

图1:沃罗诺伊图
 

三、沃罗诺伊模式无处不在

3.1 自然界中的沃罗诺伊模式

        由Voronoi图创建的模式在自然界中是常见的。在图 2 中,我制作了一些自然发生的类似 Voronoi 的图案的小拼贴画。从洋葱皮中的微观细胞,到菠萝蜜的壳和长颈鹿的皮毛。这些模式无处不在!

        它们无处不在的第一个原因是它们形成了有效的形状。正如我们前面提到的,Voronoi 图完全细分了平面:因此,所有空间都被使用。如果您想在有限的空间内尽可能多地挤压,例如在肌肉纤维或蜂箱中,这将非常方便。其次,Voronoi图是一种自发模式,每当某物从不同的点以均匀的增长率增长时(见图3)。例如,这就解释了为什么长颈鹿表现出这种模式。长颈鹿胚胎具有分散分布的黑色素分泌细胞,这是长颈鹿斑点深色色素沉着的原因。在妊娠过程中,这些细胞释放黑色素 - 因此斑点向外辐射。有兴趣的读者可以参考这篇论文,其中作者使用Voronoi图对动物外套上的斑点进行计算机渲染建模。

图2:Voronoi模式在自然界中无处不在。
(从左上到右下:肌肉的横截面,长颈鹿的毛纹,蜻蜓的翅膀,大蒜鳞茎,玉米,挂在树上的菠萝蜜。
来源:维基百科,Nirav Shah,Karolina Grabowska,StarGlade,Mali Maeder,Abi Jacob

图 3:从分散点
向外不断增长获得 Voronoi 图 来源:维基百科

3.2 建筑和艺术中的沃罗诺伊模式

        也许是因为它们自发的“自然”外观,或者仅仅是因为它们令人着迷的随机性,Voronoi模式被有意地在人造结构中实现。一个建筑例子是2008年北京奥运会期间为容纳水上运动而建造的“水立方”。它的天花板和立面上有Voronoi图(图4)。选择Voronoi图是因为它们回忆起气泡1。这个类比在晚上非常明显,当整个立面被蓝色照亮并活跃起来时。

图4:北京
 

        但中国人对沃罗诺伊图案的欣赏肯定比这座建筑更古老。宋代的关、葛皿有独特的噼啪作响的釉。陶瓷在冷却过程中很容易破裂,但是关和葛瓷的裂纹是不同的——它们是故意的。它们因其美学品质而受到追捧。由于表面的Voronoi图案,每件作品都是独一无二的。迄今为止,这是最常被模仿的瓷器风格之一(图5)。

图5:关和葛炳
 

        Voronoi图在图形艺术中也很常见,用于创建“抽象”图案。我认为它们可以制作出色的背景图像。例如,我通过生成随机点并构建Voronoi图来创建这篇文章的缩略图。然后,我根据每个单元格的点与框中随机选择的点的距离对每个单元格进行着色(图 6)。无穷无尽的“抽象”背景图像可以通过这种方式生成。

图6:彩色沃罗诺伊图
 

四、数学定义和一些有趣的属性

        到目前为止,我们已经提出了一个简单的二维Voronoi图。然而,相同类型的结构可以推广到 n 维空间。假设 P={p1,p2,...,pm} 是我们 n 维空间中的一组 m 个点。然后,可以将空间划分为 m Voronoi 单元 Vi,其中包含 Rn 中比任何其他点更接近 pi 的所有点。

        其中函数 d(x,y) 给出其两个参数之间的距离 (a)。通常,使用欧几里得距离(l2 距离):

        但是,可以使用其他距离函数设计Voronoi图。例如,图 7 显示了使用曼哈顿或城市街区距离(l1 距离)获得的 Voronoi 图。Manahattan 距离是两点之间的距离,如果您必须遵循常规网格(例如曼哈顿的城市街区)。结果是一个更“四四方方”的Voronoi图。

图7:欧几里得距离
 

图 8:同一组点
使用欧几里得(左)和曼哈顿(右)距离的 Voronoi 图比较 来源:维基百科

        欧几里得距离是Voronoi图科学应用中最常见的距离度量。它还具有生成面Voronoi细胞的优点。也就是说,如果您在单元格内取任意两个点,则连接这两个点的线将完全位于单元格内。

        最后,还应该注意的是,Voronoi 图与 k 最近邻算法 (k-NN) 紧密相连,该算法是分类、回归和聚类问题中非常流行的算法。该算法使用训练数据集中最接近的 k 个示例进行值预测。由于 Voronoi 图在包含每个种子最近的点的多边形中划分空间,因此 Voronoi 像元的边与简单的 1-最近邻问题的决策边界完全对应。

五、德劳奈三角测量

        如果您从 Voronoi 图中获取每个点并将其与其相邻单元格中的点链接,您将获得一个名为 Delaunay 三角测量的图形。用数学术语来说,德劳奈三角测量是沃罗诺伊图的对偶图。在下图中,从一组点绘制了Voronoi图(黑色)和Delaunay三角测量(灰色)。

图9:带有德劳奈三角测量的Voronoi图
来源:作者图片

        德劳奈三角测量与沃罗诺伊图一样令人惊叹。顾名思义,它会产生一组连接我们点的三角形。这些三角形是这样的,如果要在这些三角形的顶点上画一个圆,圆内就不会有其他点(见图 10)。此外,德劳奈三角测量还具有最大化三角三角形中最小角度的特性。因此,德劳奈三角测量倾向于避免具有锐角的三角形。

图 10:Delaunay 三角形的构造使得没有点落在环绕每个三角形的圆内
来源:维基百科

        这些属性使其在从一组点对表面和对象进行建模时非常有用。例如,Delaunay 三角测量用于为有限元方法生成网格,为计算机动画构建 3D 模型以及在 GIS 分析中对地形进行建模。

六、劳埃德松弛算法

        Llyod算法是一种与Voronoi图相关的有用算法。该算法包括在构建Voronoi图和查找每个单元的质心(即质心)之间反复交替(见图11)。在每次迭代中,该算法将点分开并产生更均匀的Voronoi单元。

图 11:劳埃德松弛算法
中的步骤 来源:作者图片

        经过几次迭代后,单元格将已经具有“更圆”的方面,并且点将更均匀地分布。下图对此进行了说明,其中我绘制了一组随机点的劳埃德算法的前 30 次迭代。对于每个点,我还记录它们的起始位置(灰色空心圆圈),以更好地跟踪每个单元格的运动。对于大量迭代,该图倾向于收敛到稳定的Voronoi图,其中每个种子也是细胞的质心 - 也称为质心Voronoi图。有趣的是,在2D中,Voronoi单元往往会变成六边形,因为它们提供了在平面中包装形状的最有效方式。正如任何建造蜂巢的蜜蜂都可以证明的那样,六边形细胞具有两大优势:1)它们确保细胞之间没有空白空间(即镶嵌平面),以及2)六边形提供细胞表面和周长之间的最高比例。这个所谓的蜂窝猜想,花了数学家两千年的时间才证明。

图 12:劳埃德算法
的 30 次迭代 来源:作者图片

        在数据科学中,劳埃德算法是k均值聚类的基础,k-means聚类是最流行的聚类算法之一。k 均值聚类通常是通过在空间中获取 k 个随机“质心”来启动的。然后,通过交替将数据点分组为 k 个簇:1) 将数据点分配给最接近的“质心”(这相当于为质心构建 Voronoi 图并检查哪个点在单元内)和 2) 通过计算每个单元内点的平均值来更新质心(参见图 14)。

图 14:k 均值聚类
 

        除了数据科学,劳埃德的算法还用于各种应用。例如,它在量化和有损数据压缩算法(例如劳埃德-马克斯算法)中很常见。每当人们想要间隔良好的随机点时,它也非常有用。例如,它可用于从 Delaunay 三角测量生成平滑网格,用于抖动图像,或作为视频游戏中程序地图生成的基础。

七、如何构建沃罗诺伊图?

        人们可以通过逐个构建每个单元格来构建Voronoi图。如果扩展连接每个点组合的段的平分线,则可以获得Voronoi单元的轮廓(图15)。但是,这种技术效率很低。考虑到有0.5*(n-1)n个点的组合,这种算法的复杂性会随着点数的增加呈二次增加。

图15:Voronoi细胞
的构建 来源:作者图片

        已经提出了更有效的替代办法。例如,扫描线算法通过使用二叉搜索树和优先级队列操作按顺序逐步构建 Voronoi 单元(图 16)。可以在此处找到此算法的良好描述。构建Voronoi图的另一种方法是首先构建Delaunay三角测量。获得三角测量后,延伸三角形边的平分线通向Voronoi图。无需考虑每对点即可获得德劳内三角测量。例如,一种有效的技术是在更高维度上投影抛物面上的点。将凸包重新投影回原始空间,使德劳内三角测量。

图 16:扫描线算法
来源:维基百科

        有关计算Voronoi图的不同算法及其复杂性的讨论,请参见此处,此处和此处。不断提出新的算法来提高不同情况下的计算效率(例如Yan et al. 2011, Qin et al. 2017)。 还有一些技术需要恒定时间来生成近似的Voronoi图(例如跳跃洪水算法)。

八、其他材料的链接

  • 本文讲述了约翰·斯诺(John Snow)如何使用Voronoi图来显示1854年伦敦爆发期间水泵与霍乱传播之间的联系的故事。
  • Amit Patel有一个关于游戏开发的非凡博客。我强烈推荐他关于使用 Voronoi 图生成程序地图的文章。
  • David Austin的这篇文章很好地解释了用于计算Voronoi图的扫描线算法。
  • 这张由杰森·戴维斯(Jason Davies)绘制的精美地图是基于世界各地机场位置的Voronoi图。
  • 空间镶嵌:Voronoi图的概念和应用是一本关于Voronoi图的圣经。如果您对Voronoi图有任何疑问,您一定会在这里找到答案。
  • Vincent Legat 的这些幻灯片包括一些针对不同构造算法的精美图纸。
  • Voronoi图通常用于对森林中的树木进行建模(例如Abellanas等人,2016年,Bohler等人,2018年)。
  • Voronoi图也可用于确定机器人的路径。检查这些文章:文章 1、文章 2。
  • Voronoi图有数千种应用程序。从在森林中建模树木到规划机器人路径。在这篇文章中,我几乎没有触及表面。这些链接包含有趣的应用程序列表:链接 1、链接 2、链接 3、链接 4、链接 5。
  • 本文参考资料  弗朗切斯科·贝莱利

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EI/SCOPUS征稿】第九届材料加工与制造工程国际学术会议(ICMPME 2023)

第九届材料加工与制造工程国际学术会议 2023 9th International Conference on Materials Processing and Manufacturing Engineering (ICMPME 2023) 第九届材料加工与制造工程国际学术会议(ICMPME 2023)定于2023年10月13-15日在中国南昌隆重举行。会议主要围绕“材料加工”、…

c++11 标准模板(STL)(std::basic_fstream)(五)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_fstream : public std::basic_iostream<CharT, Traits> 类模板 basic_fstream 实现基于文件的流上的高层输入/输出。它将 std::basic_i…

【Linux从入门到精通】文件描述符详解

文章目录 一、引言 二、引入文件描述符fd 2、1 观察fd的值 2、2 fd保存的位置 三、详解文件描述符fd 3、1 为什么要有文件描述符呢 3、2 到底什么是文件操作符呢 四、文件描述符的使用 4、1 验证文件描述符 4、1、1 验证stdin、stdout、stdout 4、1、2 验证fd值的大小顺序 4、…

IMU惯性测量单元相关技术(概念版)

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 新手入门系列3——Allan方差分析方法的直观理解 惯性测量单元Allan方差分析详解 IMU误差&测量模型 IMU标定之—Allan方差 IMU误差模型简介及VINS…

2023年中国日志审计市场竞争格局、市场规模、下游应用领域及行业发展趋势[图]

日志是行为或状态详细描述的载体&#xff0c;其时效性与信息丰富程度在网络安全事件分析、事件回溯和取证过程中起到重要作用。在法律层&#xff0c;日志也是重要的电子证据&#xff0c;日志记录、监控、审计手段等&#xff0c;可以帮助有效地减少信息破坏、信息泄露的问题&…

2023最新python学习方法总结!(内部机密)

不要再问我python好不好学了 我之前做过半年少儿编程老师&#xff0c;一个小学四年级的小孩子都能在我的教学下独立完成python游戏&#xff0c;植物大战僵尸简单版&#xff0c;如果要肯花时间&#xff0c;接下来的网络开发也不是问题&#xff0c;人工智能也可以学个调包也没啥问…

【TypeScript】this指向,this内置组件

this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…

PLY模型格式详解【3D】

本文介绍PLY 多边形文件格式&#xff0c;这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式&#xff1a;易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 …

多线程与高并发--------线程

一、线程的基础概念 一、基础概念 1.1 进程与线程 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 什么线程&am…

JAVA(一)

我的第一个JAVA程序 以下我们通过一个简单的实例来展示Java编程,创建文件HelloWorld.java&#xff08;文件名需与类名一致&#xff09;,代码如下 实例 public class HelloWorld{public static void main(String[] args){System.out.println(Hello World) } } 注:Srting ar…

[NLP]LLM 训练时GPU显存耗用量估计

以LLM中最常见的Adam fp16混合精度训练为例&#xff0c;分析其显存占用有以下四个部分&#xff1a; GPT-2含有1.5B个参数&#xff0c;如果用fp16格式&#xff0c;只需要1.5G*2Byte3GB显存, 但是模型状态实际上需要耗费1.5B*1624GB. 比如说有一个模型参数量是1M&#xff0c;在…

RCNA——VLAN进阶划分

一&#xff0c;实验背景 有时&#xff0c;公司可能会非常大&#xff0c;因为业务需求的因素&#xff0c;所以每个部门在每一个楼层都有相应的办公室&#xff0c;因此想要实现他们之间的互连互通&#xff0c; 可以在每个楼层部署一个楼层交换机&#xff0c;实现各个楼层相同部门…

堆的实现以及应用

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

IntelliJ IDEA和Android studio怎么去掉usage和作者提示

截止到目前我已经写了 600多道算法题&#xff0c;其中部分已经整理成了pdf文档&#xff0c;目前总共有1000多页&#xff08;并且还会不断的增加&#xff09;&#xff0c;大家可以免费下载 下载链接&#xff1a;https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ 提取码&#xf…

考虑微网新能源经济消纳的共享储能优化配置(Matlab代码实现

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

关于ArrayList的十三连问

文章目录 一、底层存储结构是什么二、初始容量三、构造方法四、扩容原理五、读写速度比较六、克隆为深克隆还是浅克隆七、多线程环境下是否安全八、增强遍历时添加或删除元素会发生什么事情九、为什么数组被transient修饰十、通过subList()获得的集合能否转为ArrayList十一、使…

基于灰狼优化(GWO)、帝国竞争算法(ICA)和粒子群优化(PSO)对梯度下降法训练的神经网络的权值进行了改进(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【python】一文了解Python爬虫 | 文末送书

目录 引言 1. 爬虫基础知识 1.1 什么是爬虫 1.2 HTTP协议 1.2.1 HTTP请求方法 1.GET请求 1.2.2 请求头常见字段 1.2.3 响应状态码 1.3 HTML解析 1.3.1 Beautiful Soup 解析库 1.3.2 XPath xpath解析原理: xpath 表达式 2. 爬虫进阶技巧 2.1 防止被反爬虫 2.1.1 …

信息论基础知识

注意&#xff1a;本文只针对离散随机变量做出探讨&#xff0c;连续随机变量的情况不适用于本文探讨的内容&#xff01; &#xff08;一&#xff09;自信息 1. 自信息 I ( x ) − l o g n P ( x ) \color{blue}I(x) - log_{n}{P(x)} I(x)−logn​P(x) 注意&#xff1a; 若n …

用ChatGPT和六顶帽思考法帮助自己更好地决策和解决问题

当我们在解决复杂问题时&#xff0c;我们常常陷入单一视角的状态。创造性思维领域的先驱爱德华德博诺&#xff0c;提出了六顶帽思考法[1]&#xff0c;这意味着我们可以从六个不同的视角来思考一个问题&#xff0c;以实现高水平决策和解决问题。 每一顶“帽子”代表不同的视角。…