Voronoi 图 (也称为 Dirichlet 镶嵌或 Thiessen 多边形) 在自然界中随处可见。你可能已经遇到过成千上万次,但或许没有用这个名字来称呼它们。Voronoi 图虽然简单,但具有惊人的特性,这些特性在各个领域都有应用,从地图学、生物学、计算机科学、统计学、考古学到建筑和艺术。
什么是 Voronoi 图呢?假设你有 n 个点散布在一个平面上,这些点的 Voronoi 图会将平面划分为恰好 n 个单元格。这会产生一个完全覆盖整个平面的镶嵌图案。例如,你可以看到,在图 1 中,我绘制了 100 个随机点及其对应的 Voronoi 图。你可以看到,每个点都被一个单元格紧紧包围,单元格的边界正好是两个或多个点之间的等距线。换句话说,单元格内的所有区域都比到其他任何点更接近单元格内的那个点。
图1:Voronoi图
来源:作者自绘
自然中的沃罗诺伊(蜂窝状)图案
由 Voronoi 图形生成的图案在自然界中非常常见。在图 2 中,我制作了一个小拼贴,展示了一些自然界中存在的类似 Voronoi 的图案。从洋葱皮中的微小细胞,到木菠萝的外壳和长颈鹿的皮肤斑纹,这些图案到处都能看到它们!
他们无处不在的第一个原因是它们形成了高效的形状。正如我们之前提到的,Voronoi图完全填充了平面:因此,所有空间都被利用了。这在有限空间内最大限度地利用每一寸地方非常方便,比如肌肉纤维或蜂窝。其次,Voronoi图是当从各点以相同速度生长时自发形成的一种模式(见图3)。例如,这可以解释为什么长颈鹿会有这样的图案。长颈鹿胚胎中散布着分泌黑色素的细胞,这些细胞在长颈鹿皮毛上形成斑点。在发育过程中,这些细胞释放黑色素,导致斑点向外扩张。有兴趣的读者可以查看这篇论文(https://www.iro.umontreal.ca/~poulin/fournier/papers/Walter-2001-ISP/Walter-2001-ISP.pdf),作者使用Voronoi图来模拟动物皮毛上的斑点,以进行计算机渲染。
图2:Voronoi图案在自然界中随处可见。
(从左上到右下:肌肉的横截面,长颈鹿的皮毛花纹,蜻蜓的翅膀,大蒜的鳞茎,玉米穗,树上的木瓜果。)
图片来源:Nephron,Nirav Shah,Karolina Grabowska,StarGlade,Mali Maeder,Abi Jacob
图3:从这些分散的点向外恒定扩展可以得到Voronoi图,
来源:Wikipedia
在建筑和艺术中可以看到的沃罗诺伊图案
或许是因为它们自然的外观,或者仅仅是由于它们令人着迷的随机性,Voronoi图案有意被应用在人造结构中。一个建筑例子是2008年北京奥运会期间用来举办水上运动的“水立方”(Water Cube)。它的天花板和立面(图4)上都采用了Voronoi图案。选择Voronoi图案是因为它们让人联想到气泡。这种类比在夜晚尤为明显,当整个立面被蓝色照亮时,仿佛活了起来。
图4:北京的水立方(冰立方)
图片来源:Wikipedia, Arne Müseler
但是中国人欣赏 Voronoi 图案的时间肯定比这座建筑还要早。宋代的官窑和哥窑瓷器以其独特的裂纹釉闻名。陶瓷在冷却过程中容易开裂,但官窑和哥窑的裂纹却是有意为之的。这些瓷器因其独特的美学价值而备受追捧,使每件作品都独一无二。这些图案的形成通常被理解为裂缝依次影响釉面上较小区域的过程。这个过程被称为“层级开裂”,常常会产生类似于 Voronoi 图的裂纹图案,这种图案。因此,Voronoi 图常被用来模拟这些裂纹行为(参考文献:[1])。迄今为止,这种类似 Voronoi 的裂纹图案是瓷器中最常被模仿的设计之一(图5)。
图5:官窑瓷器和哥窑瓷器
——来源:Daderot,Johnbod
南宋时期,带官釉的陶器
Voronoi图在图形艺术中也很常见,用于创建“抽象”图案。我认为它们非常适合做背景图。例如,我通过随机生成点并构建Voronoi图来制作这张帖子的缩略图。然后,我根据每个点到随机选择的参考点的距离来给每个单元着色(图6)。可以使用这种方法生成无数的抽象背景图。
图6:彩色Voronoi图(一种几何分划)
来源:(作者提供)
迄今为止,我们展示了一个简单的二维Voronoi图。然而,这样的结构可以推广到一个n维空间。假设P={p1,p2,…,pm}是我们这样的n维空间中的m个点的集合。那么,该空间可以被划分为每个Voronoi胞腔Vi,包含所有比到其他任何点都更接近_p_i_的_R^n_中的点。
函数 d(x,y) 表示其两个变量之间的距离。通常使用欧氏距离(即 l2 距离)。
不过,Voronoi 图也可以用其他距离函数来计算。例如,图8就是一个用曼哈顿距离(也就是城市街区距离)计算出来的 Voronoi 图。两点间距离若需遵循规则网格(比如曼哈顿的城市街区),曼哈顿距离就是这种情况下两点之间的距离。这样的 Voronoi 图看起来会更‘方正’。
图 7:欧几里得距离(Euclidean distance)
来源:Wikipedia
图8:对于同一组点,使用欧氏距离(左)和曼哈顿距离(右)的Voronoi 图形的比较
来源:Wikipedia
欧几里得距离是科学应用中最常用的 Voronoi 图距离度量。它还具有生成凸单元的优势。换句话说,在单元内的任意两点之间画一条直线,这条直线将完全位于单元内。
最后值得注意的是,Voronoi 图与 k-最近邻算法(k-NN)密切相关——这是一种在分类、回归和聚类问题中非常流行的算法。该算法使用训练数据集中最接近的 k 个样本来进行值预测。因为 Voronoi 图将空间划分成包含每个“种子点”最近点的多边形,因此 Voronoi 单元的边界线恰好对应于简单的 1-NN 问题的决策边界。
德劳内三角网如果你将每个 Voronoi图 中的点与其相邻单元格中的点连接起来,你将得到一个称为 Delaunay三角网 的图。从数学角度来说,Delaunay三角网是Voronoi图的dual graph。在下面的图中,一组点被用来绘制了Voronoi图(黑色)和Delaunay三角网(灰色)。
图9:具有Delaunay三角剖分的Voronoi图
来源:作者绘制
德劳内三角剖分和 Voronoi 图一样令人印象深刻。正如其名,它会生成一系列连接这些点的三角形。这些三角形具有这样的特性:如果在一个三角形的所有顶点上画一个圆,圆内不会有其他被连接的点(见图 10)。此外,它还使得三角形中的最小角尽可能大。因此,它倾向于避免形成非常细小角度的三角形。
图10:德劳内三角形的构建确保没有点位于每个三角形的外接圆内
来源:Wikipedia
这些特性使其在基于一组点生成表面和对象模型时非常有用。例如,Delaunay三角剖分被用来为有限元法(FEM)生成网格、构建用于计算机动画的3D模型以及在地理信息系统(GIS)分析中建模地形。
Lloyd的松弛法Lloyd算法 是一种与Voronoi图相关的实用算法。该算法通过反复交替构建Voronoi图并找到每个单元的几何中心(如图11所示)。每次迭代时,算法都会使点彼此分散,并生成更加均匀的Voronoi单元。
图11:Lloyd的松弛算法步骤如下
来源:作者
经过几次迭代后,细胞将呈现出更“圆润”的外观,点的分布也会更加均匀。如下面的图所示,我绘制了 Lloyd 算法的前 30 次迭代,这些点是随机选取的。对于每个点,我还记录了它们的初始位置(灰色空心圆),以便更好地追踪每个细胞的移动。随着迭代次数的增加,图会收敛到一个稳定的 Voronoi 图,在该图中每个种子也是其对应单元的质心——也称为质心 Voronoi 图。有趣的是,在二维空间中,Voronoi 单元会逐渐趋向于形成六边形,因为它们提供了在平面上排列形状的最有效方式。正如蜜蜂建造蜂巢时所验证的,六边形细胞有两大优势:1)它们确保单元之间不留空隙(即铺满平面),2)六边形能提供最大的面积与周长比。这一所谓的蜂巢猜想,数学家用了两千多年才得以证明。
图12: Lloyd’s算法的30次迭代
图片来源:作者制作
在数据科学中,Lloyd 算法是 K-均值聚类的基础之一——这是一种最常用的聚类算法。K-均值聚类通常从在空间中随机选取 k 个“聚类中心”起始。然后,通过交替执行以下两个阶段,将数据点分组为 k 个簇:1)将数据点分配给最近的“聚类中心”(这相当于为每个聚类中心构建一个 Voronoi 分割并检查哪些点位于该单元格内);2)通过计算每个单元格内点的平均来更新聚类中心(如图 13 所示)。
如图13所示:k-均值聚类法
来源:Wikipedia:
除了数据科学之外,Lloyd 算法还可以应用于多种应用场景。例如,在损失数据压缩算法(如Lloyd-Max算法)中非常常见。当需要均匀分布的随机点时,如生成平滑网格,该算法也非常有用。例如,可用于生成来自 Delaunay 三角剖分的平滑网格,用于图像的抖动处理,或作为视频游戏中程序化地图生成的基础。
如何制作 Voronoi 分割?可以通过一个接一个地构建每个单元来构造 Voronoi 图。如果将连接每点对的线段的中垂线延伸,就可以得到 Voronoi 单元的轮廓(图 14)。然而,这种方法效率很低。考虑到有 0.5(n-1)n 对点组合,随着点数量的增加,算法复杂度会呈二次增长。
图14:构建Voronoi单元
图片来源:作者
更高效的替代方法已经被提出。例如,Sweep line算法通过依次使用二叉搜索树和优先队列操作逐步构建Voronoi单元(图15)。关于此算法的一个很好的描述可以在这里找到here。另一种构建Voronoi图的方法是先构造Delaunay三角剖分。一旦获得三角剖分,将三角形边的中垂线延伸即可得到Voronoi图。构建Delaunay三角剖分时并不需要考虑每一对点。例如,一种有效的方法是将点投影到更高维度的抛物面上。将凸包重新投影回原始空间即可得到Delaunay三角剖分。
图15-:扫描线法
出处:Wikipedia(来源:维基百科)
关于不同算法计算 Voronoi 图及其复杂度的讨论可以在这里找到 here,这里,以及 这里。新算法不断被提出以在各种情形下提高计算效率(比如:Yan 等人 2011,Qin 等人 2017)。还有一些技术可以在常量时间内生成近似 Voronoi 图(比如:跳跃洪水算法)。
更多相关材料的链接- 这篇文章讲述了约翰·斯诺如何使用 Voronoi 图来展示伦敦 1854 年霍乱爆发期间水井与霍乱传播之间的联系。
- 阿米特·帕特尔有一个关于游戏开发的出色博客。我强烈推荐他关于使用 Voronoi 图生成程序地图的文章。
- 大卫·奥斯汀的这篇帖子对计算 Voronoi 图的扫描线算法进行了很好的解释。
- 贾森·戴维斯的这张漂亮的地图是基于世界各地机场位置的 Voronoi 图。
- 空间镶嵌:Voronoi 图的概念与应用 是关于 Voronoi 图的圣经。如果你对 Voronoi 图有任何疑问,这里你一定能找到答案。
- 文森特·勒加特的这些幻灯片包括了不同构建算法的精美插图。
- Voronoi 图通常用于模拟森林中的树木分布(例如:阿贝拉纳斯等人,2016,波勒等人,2018)。
- Voronoi 图可以用来规划机器人的路径。可以参考这些文章:文章1,文章2。
- Voronoi 图有成千上万的应用。从模拟森林中的树木分布到规划机器人的路径。在这篇文章中,我仅仅触及了表面。这里还有一些有趣的实际应用链接:链接1,链接2,链接3,链接4,链接5。
本文最初发表在这里:这里:
F.S. Bellelli: Voronoi 图的迷人世界 Voronoi 图(也叫作 Dirichlet 镶嵌或 Thiessen 多边形)在自然界中随处可见。了解更多请点击链接…fbellelli.com共同学习,写下你的评论
评论加载中...
作者其他优质文章