蝴蝶算法是一种常用的插值细分算法,由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细分的曲面视觉效果更加好。

而且在初始网格太过稀疏的情况下,蝴蝶细分出来的效果很不理想:

初始网格,左边为面显示右边为线显示

一次改进的蝴蝶细分

四次蝴蝶细分后的图像

版权声明:本文为yezhangxiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yezhangxiang/archive/2011/04/10/2011284.html