为了账号安全,请及时绑定邮箱和手机立即绑定

有趣的Voronoi图世界

关于此非常普遍的模式的简短介绍以及它的应用场合

Voronoi 图 (也称为 Dirichlet 镶嵌或 Thiessen 多边形) 在自然界中随处可见。你可能已经遇到过成千上万次,但或许没有用这个名字来称呼它们。Voronoi 图虽然简单,但具有惊人的特性,这些特性在各个领域都有应用,从地图学、生物学、计算机科学、统计学、考古学到建筑和艺术。

什么是 Voronoi 图呢?

假设你有 n 个点散布在一个平面上,这些点的 Voronoi 图会将平面划分为恰好 n 个单元格。这会产生一个完全覆盖整个平面的镶嵌图案。例如,你可以看到,在图 1 中,我绘制了 100 个随机点及其对应的 Voronoi 图。你可以看到,每个点都被一个单元格紧紧包围,单元格的边界正好是两个或多个点之间的等距线。换句话说,单元格内的所有区域都比到其他任何点更接近单元格内的那个点。

图1:Voronoi图
来源:作者自绘

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图案在自然界中随处可见。
(从左上到右下:肌肉的横截面,长颈鹿的皮毛花纹,蜻蜓的翅膀,大蒜的鳞茎,玉米穗,树上的木瓜果。)
图片来源:NephronNirav ShahKarolina GrabowskaStarGladeMali MaederAbi Jacob

图3:从这些分散的点向外恒定扩展可以得到Voronoi图,
来源:Wikipedia

在建筑和艺术中可以看到的沃罗诺伊图案

或许是因为它们自然的外观,或者仅仅是由于它们令人着迷的随机性,Voronoi图案有意被应用在人造结构中。一个建筑例子是2008年北京奥运会期间用来举办水上运动的“水立方”(Water Cube)。它的天花板和立面(图4)上都采用了Voronoi图案。选择Voronoi图案是因为它们让人联想到气泡。这种类比在夜晚尤为明显,当整个立面被蓝色照亮时,仿佛活了起来。

图4:北京的水立方(冰立方)
图片来源:Wikipedia, Arne Müseler

但是中国人欣赏 Voronoi 图案的时间肯定比这座建筑还要早。宋代的官窑和哥窑瓷器以其独特的裂纹釉闻名。陶瓷在冷却过程中容易开裂,但官窑和哥窑的裂纹却是有意为之的。这些瓷器因其独特的美学价值而备受追捧,使每件作品都独一无二。这些图案的形成通常被理解为裂缝依次影响釉面上较小区域的过程。这个过程被称为“层级开裂”,常常会产生类似于 Voronoi 图的裂纹图案,这种图案。因此,Voronoi 图常被用来模拟这些裂纹行为(参考文献:[1])。迄今为止,这种类似 Voronoi 的裂纹图案是瓷器中最常被模仿的设计之一(图5)。

图5:官窑瓷器和哥窑瓷器
——来源:DaderotJohnbod
南宋时期,带官釉的陶器

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 等人 2011Qin 等人 2017)。还有一些技术可以在常量时间内生成近似 Voronoi 图(比如:跳跃洪水算法)。

更多相关材料的链接

本文最初发表在这里:这里

F.S. Bellelli: Voronoi 图的迷人世界 Voronoi 图(也叫作 Dirichlet 镶嵌或 Thiessen 多边形)在自然界中随处可见。了解更多请点击链接…fbellelli.com
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消