一、Voronoi Noise
沃罗诺伊图(Voronoi Diagram,也称作Dirichlet tessellation,狄利克雷镶嵌)是由俄国数学家Georgy Fedoseevich Voronoi建立的空间分割算法,其空间划分思想来源于笛卡尔用凸域分割空间理论,也就是说,Voronoi图实际是一种空间划分方法,这种划分方法解决了这样一个问题:如何根据已知点划分空间,使得晶胞与点一一对应,并使晶胞内任取一点都与最近的已知点围在一起,或者换一种说法就是沃罗诺伊图基于一组特征点将空间分割成不同区域,而每一区域又仅包含唯一的特征点,并且该区域内任意位置到该特征点的距离比到其它的特征点都要更近。所以Voronoi图有以下特性(以二维平面为例):
(1)每个V多边形内有一个特征点;
(2)每个V多边形内点到该特征点距离短于到其它特征点的距离;
(3)多边形边界上的点到生成此边界的特征点距离相等;
(4)邻接图形的Voronoi多边形界线以原邻接界线作为子集。
Voronoi图作一种空间划分算法,由于其特性,在很多领域都有应用,例如用来规划电信信号塔选址以达到更好的覆盖和经济性;用来规划航线达到充分利用空间但又防范避免空中撞击风险;用来规划路线达到避开障碍物的目的。另外其在地理学、气象学、结晶学、航天、核物理学、机器人等领域具有广泛的应用。
对图形学来讲,Voronoi图的空间划分特性可以用来模拟物体破碎效果:
Voronoi图能形成独特的图案纹理,也常用在程序纹理生成中。
二、Delaunay Triangulation
Voronoi图定义简单,我们甚至可以使用手工做铅垂线的方式来作出给定特征点的Voronoi图,但理论上解决这个问题却比较难,直到Voronoi图提出来后25年,Delaunay才提出了解决该剖分完整而实用的方法,这就是著名的德劳内三角剖分(Delaunay Triangulation)。
Delaunay三角剖分具有以下特性:
1、在Delaunay三角形网中任一三角形的外接圆范围内不会有其它点存在并与其通视,即空圆特性;
2、在构网时,总是选择最邻近的点形成三角形并且不与约束线段相交;
3、形成的三角形网总是具有最优的形状特征,任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形6个内角中最小的角度不会变大;
4、不论从区域何处开始构网,最终都将得到一致的结果,即构网具有唯一性。
Delaunay三角剖分也有很多算法,网上相关资料很多,不再详述,本文参考文献部分也列出了部分Delaunay三角剖分方面的文章。
Delaunay三角剖分是Voronoi图的对偶图,因此得到Delaunay三角剖分后就可以得到Voronoi图。
三、算法步骤
通过上述论述,我们将生成Voronoi图的算法概要步骤描述如下:
1、正方形平面区域中有若干个特征点
2、基于特征点进行德劳内三角剖分
3、求取德劳内三角形处接圆圆心(蓝色点)
4、连接相邻外心(边界处则是发射一条射线)
5、得到Voronoi图
四、算法实现
根据第三小节中的算法步骤,我们第一步生成了若干特征点:
第二步进行了德劳内三角剖分:
第三步,求取德劳内三角形外心,并连接外心得到Voronoi图:
Voronoi是一种空间划分算法,因其划分后特殊的图案,我们也可以将其作为噪声来使用,其实上,Voronoi算法是可以生成噪声图形的,下图是我们使用cg实现的voronoi噪声图形。
五、代码下载
在算法实现中,C#代码参考了参考文献1的实现,Cg代码参考了参考文献7的实现。
1、VS2015平台用C#实现的2D_VoronoiNoise Voronoi noise
2、Unity2017.1.1f1平台用Cg实现的2D,3D Voronoise Voronoise
参考文献
1、维诺图(Voronoi Diagram)分析与实现 维诺图(Voronoi Diagram)分析与实现
2、三角剖分详解 三角剖分详解
3、Delaunay三角剖分算法 Delaunay三角剖分算法
4、三角剖分算法(delaunay) 三角剖分算法(delaunay)
5、To Voronoi and Beyond To Voronoi and Beyond
6、沃罗诺伊图 沃罗诺伊图
7、voronoise voronoise