分享

【转】B

 果宝战士书屋 2016-07-13

考虑设计一个花瓶的剖面图。下图左边是11次(degree)的贝塞尔曲线;但是它很难弯曲瓶颈到线段 P4P5。当然,我们可以在这个线段附近增加控制点来增加该区域的权重。但是这会增加曲线的次数(degree)。许多情况下,不值得使用如此高次(degree)的多项式。

  

     如前面讨论过的贝塞尔曲线的导数 ,我们可以将两个贝塞尔曲线连接起来。只要第一条曲线的最后一段和第二条曲线的第一段有相同方向,我们至少可以获得 G1 连续性,因为切向量有相同方向但可能有不同的长度(即,如果长度相同,它就是C1 连续的)。上边中间图使用了这个思想。它有3个3次贝塞尔曲线段,连接点用黄色矩形框标记。这说明有满足 G1 连续条件的多重低阶贝塞尔曲线段,我们可以设计出复杂形状。但是,保持 G1 连续条件会是乏味和不受欢迎的。

     有没有可能我们仍用更低阶曲线段而不用考虑 G1 连续条件? B-样条曲线是贝塞尔曲线的推广且正是为了解决这个问题的。上边右图是一个8控制点的3次B-样条曲线。实际上,由5条3次贝塞尔曲线段连接起来形成了由控制点定义的B-样条曲线。 上图中,那些小点把B-样条曲线划分为贝塞尔曲线段。可以像贝塞尔曲线那样移动控制点来修改曲线的形状。我们也可以修改曲线的细分(subdivision)。因此B-样条曲线有更高阶曲线设计的自由度。

    直接细分(Subdividing)曲线是很困难的。因此,我们细分曲线的定义域。因此,如果曲线的定义域是[0,1],这个闭区间被称为节点(knots)的点细分而成。设这些节点是 0 <= u0 <= u1 <= ... <= um <= 1。那么点C(ui)的曲线细分如下图所示,因此,修改[0,1]的细分会改变曲线的形状。

    总之,为了设计一个B-样条曲线,我们需要一系列的控制点,一系列的节点和一系列的系数,每个系数对应一个控制点,所以所有曲线段连接在一起满足某个连续条件。系数的计算可能是最复杂的步骤因为它们必须保证某个连续条件。

Definition of B-spline basis functions

贝塞尔基函数用作权重。B-样条基函数也一样;但更复杂。但是它有两条贝塞尔基函数所没有的特性,即(1)定义域被节点细分(subdivided); (2) 基函数不是在整个区间非零。实际上,每个B样条基函数在附近一个子区间非零,因此,B-样条基函数相当“局部”。

    设U 是m + 1个非递减数的集合,u0 <= u2 <= u3 <= ... <= umui称为节点knots, 集合U 称为节点向量knot vector, 半开区间[uiui+1) 是第i个节点区间(knot span。注意某些ui可能相等,某些节点区间会不存在。如果一个节点 ui 出现 k 次 (即,ui = ui+1 = ... = ui+k-1), 其中 k > 1, ui 是一个重复度(multiplicity多重节点,写为 ui(k)。 否则,如果ui只出现一次,它是一个简单节点。如果节点等间距(即, ui+1 - ui 是一个常数,对 0 <= i <= m - 1),节点向量或节点序列称为均匀的;否则它是非均匀的

    节点可认为是分隔点,将区间[u0um]细分为节点区间。所有B-样条基函数被假设定义域在[u0um]上。在本文中,我们经常使用u0 = 0和um = 1,所以定义域是闭区间[0,1]。

    为了定义B-样条基函数,我们还需要一个参数,基函数的次数(degree)p,第ip次B-样条基函数,写为Ni,p(u),递归定义如下:

 

 

       上述公式通常称为Cox-de Boor递归公式。 这个定义看起来很复杂;但是不难理解。如果次数(degree)为零(即, p = 0),这些基函数都是阶梯函数,这也是第一个表达式所表明的。即,如果u是在第i个节点区间[uiui+1)上基函数Ni,0(u)是1。 例如,如果我们有四个节点u0 = 0, u1 = 1, u2 = 2和 u3 = 3, 节点区间 0, 1 和2是[0,1), [1,2), [2,3),0次基函数是N0,0(u) = 1在 [0,1) ,在其它区间是0;N1,0(u) = 1 在 [1,2)上,在其它区间是0;N2,0(u) = 1在[2,3)上,其它区间是0。如下图所示:

 

 

       为了理解p大于0时计算Ni,p(u)的方法,我们使用三角计算格式。所有节点区间列在左边(第一)列,所有零次基函数在第二列。见下图。

 

        为了计算Ni,1(u),需要Ni,0(u)和Ni+1,0(u)。因此,我们可以计算N0,1(u), N1,1(u), N2,1(u), N3,1(u) 等等。所有这些Ni,1(u)写在第三列。一旦所有Ni,1(u)计算完毕,我们可以计算Ni,2(u)并将其放在第四列。继续这个过程直到所有需要的Ni,p(u)的计算完毕。

        上面我们获得了针对节点向量 U = { 0, 1, 2, 3 }的N0,0(u), N1,0(u)和N2,0(u) 。现在计算N0,1(u)和N1,1(u)。要计算N0,1(u),因为i = 0和p = 1,从定义出发有

 

因为u0 = 0, u1 = 1和u2 = 2,上式变为

 

因为N0,0(u)在[0,1)上非零且N1,0(u)在[1,2)上非零,如果u在[0,1)上 (resp., [1,2) ), 只有N0,0(u) (resp.N1,0(u) )对N0,1(u)有贡献。因此,如果u 在[0,1)上, N0,1(u) 是uN0,0(u) = u而如果u 在[1,2)上, N0,1(u)

...      

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多