B-样条曲线(B-spline Curve)总结

概述

B-样条曲线,是B-样条基函数的线性组合,是贝塞尔曲线的一般化。
给定n+1个控制点,P0,P1, ..., Pn以及一个节点向量U = { u0,u1, ..., um }, p 次B-样条曲线由这些控制点和节点向量U 定义,其公式为:

B-样条曲线公式

 

在上式中, Ni,p(u)是 p次B-样条基函数。

B-样条基函数

节点向量

设U 是m + 1个非递减数的集合,u0 <=u1 <= u2 <= ... <= um。ui称为节点(knots), 集合U 称为节点向量(knot vector), 半开区间[ui, ui+1) 是第i个节点区间(knot span)。注意某些ui可能相等,某些节点区间会不存在。如果一个节点ui出现 k 次 (即,ui = ui+1 = ... = ui+k-1), 其中 k > 1, ui 是一个重复度(multiplicity)为k 的多重节点,写为 ui(k)。 否则,如果ui只出现一次,它是一个简单节点。如果节点等间距(即, ui+1 - ui 是一个常数,对 0 <= i <= m - 1),节点向量或节点序列称为均匀的;否则它是非均匀的。一般情况下,我们经常使用 u0 = 0和 um = 1,所以定义域是闭区间[0,1]。

基函数定义

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

B-样条基函数定义


上述公式通常称为Cox-de Boor递归公式。
为了理解计算Ni,p(u)的方法,我们使用三角计算格式:

 

基函数计算格式

重要性质

  1. Ni,p(u)是一个在u上的p次多项式;
  2. 非负性,对于所有的i,p和u,Ni,p(u)是非负的;
  3. 局部支撑(Local Support),Ni,p(u)是在[ui,ui+p+1]上的非零多项式;
  4. 在任意区间[ui,ui+1),最多有p+1个p次基函数非零,即Ni-p,p(u),Ni-p+1,p(u),Ni-p+2,p(u),……,Ni,p(u);
  5. 单位分解(Partition of Unity),所有的非零的p次基函数在区间[ui,ui+1)上的和为1;
  6. 如果节点数是m+1,基函数的次数是p,而p次基函数的数目是n+1,则m=n+p+1;
  7. 基函数Ni,p(u)是p次多项式的复合曲线,连接点在[ui,ui+p+1]上的节点处;
  8. 在一个有重复度k的节点处,基函数Ni,p(u)是Cp-k连续的。

多重节点的影响

  1. 每个重复度 k 的节点减小最多k-1 个基函数的非零定义域;
  2. 在每个重复度k的内部节点,非零基函数的数目最多p - k + 1, 其中 p 是基函数的次数。

B-样条曲线

曲线类别

 

B-样条曲线种类示意

 

开曲线

对于open(B-样条曲线),定义域是[up,um-p]
考虑一个由14个控制点(即,n = 13)定义的 6次 (即,p = 6) B-样条曲线。其节点的数目是 21 (即, m = n + p + 1 = 20)。如果节点向量是均匀的, 节点是0, 0.05, 0.10, 0.15, ..., 0.90, 0.95 和 1.0。 开(open)曲线定义在[up, um-p] = [u6, u14] = [0.3, 0.7]上且与第一边和最后一边不相切。下面上图显示了曲线而下图给出了B-样条基函数。

B-样条曲线

 

B-样条基函数

闭曲线

有许多方法来产生闭曲线。简单的一种就是或者wrapping控制点或者wrapping节点向量。

wrapping控制点

假设我们想构建一个p次闭(closed)B-样条曲线C(u),由n+1 控制点P0,P1, ..., Pn.定义。节点数目是m+1, 其中 m = n + p + 1. 这儿是构建过程:

  1. 设计一个均匀 m+1 个节点的节点序列:u0 = 0, u1 = 1/m, u1 = 2/m, ..., um = 1。注意曲线的定义域是 [up, um-p].
    2.Wrap头p 个和最后p 个控制点。更准确地,设P0 = Pn-p+1, P1=Pn-p+2, ..., Pp-2 = Pn-1 and Pp-1 = Pn. 如下图所示。

    closed-curve-1.jpg

     

    closed-curve-2.jpg

     

    closed-curve-3.jpg

     

    closed-curve-4.jpg

wrapping节点

假设我们想要构建一个由n+1个控制点P0, P1, ..., Pn定义的p次闭B-样条曲线C(u) 。构建过程如下:

  1. 增加一个新控制点 Pn+1 =P0.因此,控制点的数目是 n+2;
  2. 找到一个合适的有 n+1节点的节点序列u0, u1, ..., un 。这些节点不必要是均匀的,an advantage over the method discussed above
  3. 增加 p+2 个节点并 wrap 头 p+2个节点: un+1 = u0, un+2 = u1, ..., un+p = up-1, un+p+1 = up, un+p+2= up+1,如下图所示。这样,我们有n+p+2 = (n+1)+p+1 个节点;
  4. 定义在上述构建的 n+1个控制点和n+p+2 个节点上的 p次开B-样条曲线C(u)是一个闭曲线,在连接点处C(u0) = C(un+1)有Cp-1 连续性。注意闭曲线的定义域是 [u0, un+1]。

    Wrapping节点

重要性质

  1. B-样条曲线是个逐段曲线,每个分量是p次曲线;
  2. 等式m=n+p+1必须满足;
  3. Clamped B-样条曲线C(u)通过首尾两个控制点 P0 和Pn ;
  4. 样条曲线包含在控制折线(ployline)的凸包内。更特别地,如果u 在节点区间[ui,ui+1)里,那么C(u)在控制点Pi-p, Pi-p+1, ...,Pi的凸包里;
  5. Pi 只影响在区间[ui,ui+p+1)上的曲线 C(u);
  6. C(u) 在重复度 k 的节点上是Cp-k 连续的 ;
  7. 变分减小性质对B-样条曲线也成立。如果曲线在平面(resp., 空间)上,这意味着没有直线(resp., 平面) 与 B-样条曲线相交的次数多于它与曲线控制折线(polyline)相交的次数;
  8. 贝塞尔曲线是B-样条曲线的特例;
  9. 仿射不变性。

链接

本文旨在加深对B-样条曲线的理解,主要是对下述教程的总结,具体内容可以参考如下教程:
B-样条曲线教程



作者:手写的以后
链接:https://www.jianshu.com/p/49aff913104c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
样条曲线Spline Curve)是一种在数学和计算机图形学中常见的高级曲线生成技术。它是一种连续的曲线,通过一系列控制点进行定义,这些控制点可以自由地移动,以改变曲线的形状。样条曲线在许多领域都有应用,包括计算机图形、物理模拟、数据插值等。 在Python中,有许多库可以用来创建样条曲线。其中最常用的是SciPy库中的`scipy.interpolate.UnivariateSpline`和`scipy.interpolate.BarycentricInterpolator`。 下面是一个使用`UnivariateSpline`创建样条曲线的简单示例: ```python from scipy.interpolate import UnivariateSpline import numpy as np # 定义控制点 control_points = np.array([[0, 0], [1, 1], [2, 2], [3, 3]]) # 创建样条曲线对象 spline = UnivariateSpline(control_points[:, 0], control_points[:, 1]) # 生成样条曲线上的点 x = np.linspace(0, 4, 1000) y = spline(x) # 绘制样条曲线 import matplotlib.pyplot as plt plt.plot(x, y) plt.show() ``` 在这个例子中,我们首先导入了必要的库,然后定义了一组控制点。我们使用这些控制点创建了一个`UnivariateSpline`对象,然后生成了一个在给定x值上的y值数组。最后,我们使用matplotlib库将样条曲线绘制出来。 请注意,样条曲线的形状取决于控制点的选择。通过移动和控制点,可以创建出各种形状的样条曲线样条曲线还有许多其他的应用,例如用于插值、拟合数据等。 如果你对更高级的样条曲线技术或更特定的应用场景感兴趣,你可能需要查阅更专门的库或教程。Python中有许多其他的库,如`curve_fit`(用于非线性拟合),以及专门用于插值和数据处理的库,如`scipy.interpolate`和`numpy`等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值