改进的蝴蝶算法的详细介绍
蝴蝶算法是一种常用的插值细分算法,由NIRA DYN and DAVID LEVIN (Tel-Aviv University) and JOHN A. GREGORY (Brunei University)在论文A Butterfly Subdivision Scheme for Surface Interpolation with Tension Control 提出,但是原始算法在度不为6的点不光滑,Denis Zoriny Peter Schr ¨ odery Wim Sweldens在论文Interpolating Subdivision for Meshes with Arbitrary Topology中提出了改进的蝴蝶算法,可以在任意的三角网格上生成G1连续的细分曲面。
但是我之前在实现改进的蝴蝶算法时总是没看懂,因为在一个端点(V1)的度为6而另一个端点(V2)不为6的情形下,到处查找到底资料只是解释了与V2相邻的端点的权重,而且这些权重相加为1/4。但是应该严格保证权重之和为1。我猜测V2的权重为3/4,查找了很多论文都没有清晰的解释,在《地理与地理信息科学》上看到一篇《一种改进的自适应蝴蝶细分算法及其在三维地质建模中的应用》,请教了作者,感谢董攀同学的回信给出了详细的解释,现将回信中的附件发在这里,不知道算不算侵权诶。
(3)Butterfly算法简介
该算法的输入数据为原始控制TIN面网,输出数据为加密后的TIN面网(经过插值)。具体过程如下:
①对于每一个三角形,在每条边的中点处附近插值,把每个三角形一分为四(如图2)。
②新插入的点(即所谓奇点)都在已有三角形的边上。对于它们的坐标点的计算,将分以下几种情况:
(a)当该奇点所在边的两个端点的度均为6时(如图3)
如上图所示,中间黄色点为插入的奇点,它的坐标值通过周围八个点(绿色)的坐标值加权平均得到。并且周围的点按权重不同可分为三类,各自权重如下:
a = 1/2,b = 1/8,c = -1/16
(b)当该奇点所在边的两个端点中,一个端点的度为6,另一个不为6时(如图4)
如图4所示,奇点所在的边的两个端点中,点v的度不为6,点e0的度为6,则奇点的坐标值要根据点v及v的所有相临结点(绿色)的坐标加权得到。v点的权重如下:
v = 3/4
假设点v共有n个邻结点,则各邻结点的权值可根据n值的不同分别计算:
n = 3时:e0 = 5/12,e1 = e2 = -1/12;
n = 4时:e0 = 3/8,e1 = 0,e2 = -1/8,e3 = 0;
n ≥ 5时:ej = [1/4 + cos(2∏*j/n) + 1/2 * cos(4∏*j/n)]/n,其中j = 0,1,…,n-1。
(c)当该新边点所在边的两个端点的度均不为6时(如图5)
先以v1为中心,按前述(b)情况中的方法计算出奇点的坐标,记为(x1,y1,z1),再以v2为中心同样计算出奇点的坐标,记为(x2,y2,z2),然后对两组坐标取平均值,得到奇点的坐标。
(d)当该奇点所在边是初始控制网的边界时(当网格不闭合时存在这种情况,如图6),采用四点法。
此时参与计算的各点的权值取值如下:
a = 9/16,b = -1/16
改进的蝴蝶细分和loop细分的对比图如下:
原始网格
两次loop的效果
两次改进蝴蝶细分的效果
可以看出还是loop细分的曲面视觉效果更加好。
而且在初始网格太过稀疏的情况下,蝴蝶细分出来的效果很不理想:
初始网格,左边为面显示右边为线显示
一次改进的蝴蝶细分
四次蝴蝶细分后的图像