仅由一段多项式或有理多项式曲线段组成的曲线往往还不能满足实际应用的要求,它们如下缺点:

  • 当需要满足的约束条件很多时,需要使用高次曲线。例如,为了使Bezier曲线通过 n n n个数据点,需要采用 n − 1 n-1 n−1次的曲线。但是,高次曲线用计算机处理时效率较低并且数值稳定性差。
  • 为了精确地拟合一些复杂的形状,需要采用高次曲线。
  • 单独一段曲线(曲面)不适合交互形状设计。尽管可以通过修改控制顶点(和权因子)来改变(有理)Bezier曲线(曲面)的形状,但是,这种控制不具有局部性。

以上问题可以通过采用由分段多项式或分段有理多项式表示的曲线(曲面)来解决。假设曲线 C ( u ) C(u) C(u)由 m ( = 3 ) m(=3) m(=3)段 n n n次多项式组成,其定义域为 u ∈ [ 0 , 1 ] u\in[0,1] u∈[0,1]。参数 u 0 = 0 < u 1 < u 2 < u 3 = 1 u_0=0<u_1<u_2<u_3=1 u0​=0<u1​<u2​<u3​=1称为断点(breakpoints),它们对应于三段多项式曲线的端点。记第 i i i段多项式曲线为 C i ( u ) , i = 1 , 2 , … , m C_i(u),i=1,2,\dots,m Ci​(u),i=1,2,…,m。在构造曲线时,相邻曲线段应该满足一定的连续性(每个断点处的连续性可以不同)。令 C i ( j ) C_i^{(j)} Ci(j)​表示 C i ( u ) C_i(u) Ci​(u)的 j j j阶导矢,如果 C i ( j ) ( u i ) = C i + 1 ( j ) ( u i ) C_i^{(j)}(u_i)=C_{i+1}^{(j)}(u_i) Ci(j)​(ui​)=Ci+1(j)​(ui​)对所有 0 ⩽ j ⩽ k 0\leqslant j \leqslant k 0⩽j⩽k成立,则称曲线 C ( u ) C(u) C(u)在 u i u_i ui​处是 C k C^k Ck连续的。

可以用任何一种多项式曲线的表示形式来表示 C i ( u ) C_i(u) Ci​(u)。假设次数为3,每段4个控制点,一共12个控制点, P i j P_i^j Pij​表示第 j j j段多项式曲线的第 i i i个控制点。断点集合为 U = { u 0 , u 1 , u 2 , u 3 } U=\{u_0,u_1,u_2,u_3\} U={u0​,u1​,u2​,u3​}均保持不变,令12个控制点 P i j P_i^j Pij​任意变化,则得到一个由 U U U上的所有分段三次多项式曲线组成的向量空间 V V V。 V V V的维数是12, V V V中的曲线在 u 1 u_1 u1​或 u 2 u_2 u2​处可能不连续。现在规定 P 3 1 = P 0 2 P_3^1=P_0^2 P31​=P02​, P 3 2 = P 0 3 P_3^2=P_0^3 P32​=P03​,则得到定义在 U U U上并且处处至少 C 0 C^0 C0连续的分段三次多项式曲线组成的向量空间 V 0 V_0 V0​。 V 0 V_0 V0​的维数是10,并且 V 0 ⊂ V \mathcal{V}^{0}\subset\mathcal{V} V0⊂V。

如果要求曲线是 C 1 C^1 C1连续的,则更为复杂一些。考虑 u = u 1 u=u_1 u=u1​的情形。假设 P 3 1 = P 0 2 P^1_3=P^2_0 P31​=P02​,令 v = u − u 0 u 1 − u 0 v=\frac{u-u_0}{u_1-u_0} v=u1​−u0​u−u0​​和 w = u − u 1 u 2 − u 1 w=\frac{u-u_{1}}{u_{2}-u_{1}} w=u2​−u1​u−u1​​分别是在区间 [ u 0 , u 1 ] [u_0,u_1] [u0​,u1​]和 [ u 1 , u 2 ] [u_1,u_2] [u1​,u2​]上的局部参数, 0 ⩽ v , w ⩽ 1 0\leqslant v,w \leqslant1 0⩽v,w⩽1。在 u 1 u_1 u1​处 C 1 C^1 C1连续意味着
1 u 1 − u 0 C l ( 1 ) ( v = 1 ) = C 1 ( 1 ) ( u 1 ) = C 2 ( 1 ) ( u 1 ) = 1 u 2 − u 1 C 2 ( 1 ) ( w = 0 ) \begin{aligned}\frac{1}{u_{1}-u_{0}}\mathbf{C}_{\mathrm{l}}^{\left(1\right)}\left(v=1\right)=\mathbf{C}_{1}^{\left(1\right)}\left(u_{1}\right)=\mathbf{C}_{2}^{\left(1\right)}\left(u_{1}\right) =\frac{1}{u_2-u_1}\mathbf{C}_{2}^{(1)}\left(w=0\right)\end{aligned} u1​−u0​1​Cl(1)​(v=1)=C1(1)​(u1​)=C2(1)​(u1​)=u2​−u1​1​C2(1)​(w=0)​

由Bezier曲线在两个端点处导矢的公式
C ′ ( 0 ) = n ( P 1 − P 0 ) C ′ ′ ( 0 ) = n ( n − 1 ) ( P 0 − 2 P 1 + P 0 ) C ′ ( 1 ) = n ( P n − P n − 1 ) C ′ ′ ( 1 ) = n ( n − 1 ) ( P n − 2 P n − 1 + P n − 2 ) \begin{aligned}&\mathbf{C}^{\prime}(0) =n(\mathbf{P}_{1}-\mathbf{P}_{0})\quad\mathbf{C}^{\prime\prime}(0)=n(\mathbf{n}-1)\left(\mathbf{P}_{0}-2\mathbf{P}_{1}+\mathbf{P}_{0}\right) \\&\mathbf{C}'(1) =n(\mathbf{P}_{n}-\mathbf{P}_{n-1})\quad\mathbf{C}^{\prime\prime}(1)=n(n-1)(\mathbf{P}_{n}-2\mathbf{P}_{n-1}+\mathbf{P}_{n-2})\end{aligned} ​C′(0)=n(P1​−P0​)C′′(0)=n(n−1)(P0​−2P1​+P0​)C′(1)=n(Pn​−Pn−1​)C′′(1)=n(n−1)(Pn​−2Pn−1​+Pn−2​)​
可以得到
3 u 1 − u 0 ( P 3 1 − P 2 1 ) = 3 u 2 − u 1 ( P 1 2 − P 0 2 ) \frac{3}{u_1-u_0}(\mathbf{P}_3^1-\mathbf{P}_2^1)=\frac{3}{u_2-u_1}(\mathbf{P}_1^2-\mathbf{P}_0^2) u1​−u0​3​(P31​−P21​)=u2​−u1​3​(P12​−P02​)
故有
p 3 1 = ( u 2 − u 1 ) p 2 1 + ( u 1 − u 0 ) p 1 2 u 2 − u 0 ( 2.1 ) \begin{aligned}\mathbf{p}_3^1=\frac{(u_2-u_1)\mathbf{p}_2^1+(u_1-u_0)\mathbf{p}_1^2}{u_2-u_0}\quad(2.1) \end{aligned} p31​=u2​−u0​(u2​−u1​)p21​+(u1​−u0​)p12​​(2.1)​

(2.1)式说明 P 3 1 P^1_3 P31​和 P 3 2 P^2_3 P32​可分别利用 P 2 1 P^1_2 P21​, P 1 2 P^2_1 P12​和 P 2 2 P^2_2 P22​, P 1 3 P^3_1 P13​表示。因此,由 U U U上所有 C 1 C^1 C1连续的分段三次多项式曲线组成的向量空间 V 1 V^1 V1维数为8,并且有 V 1 ⊂ V 0 ⊂ V V^1\subset V^0\subset V V1⊂V0⊂V。

以上表明,对分段多项式曲线中的各个(多项式)曲线段独立地进行存储和操作并不是处理这类曲线的理想方法。原因如下:

  • 第一,需要存储多余的数据。事实上,在12个系数中,对于 C 1 C^1 C1连续的三次曲线仅需存储其中8个,而对于 C 2 C^2 C2连续的三次曲线仅需存储6个即可。
  • 第二,若采用Bezier形式来表示各个多项式曲线段,则 C ( u ) C(u) C(u)的连续性依赖于控制点的位置。因此,在保持连续性不变的情况下,调整控制点位置的灵活性就减少了。如果需要 C ( u ) C(u) C(u)具有 C 1 C^1 C1连续性,并且 C 1 ( u ) C_1(u) C1​(u)和 C 3 ( u ) C_3(u) C3​(u)的形状已经满意,但是希望修改 C 2 ( u ) C_2(u) C2​(u)的形状,他就没有办法了。因为为了保持 C 1 ( u ) C_1(u) C1​(u)和 C 3 ( u ) C_3(u) C3​(u)的形状不变以及 C 1 C^1 C1连续性, C 2 ( u ) C_2(u) C2​(u)的控制点都不能被移动了。
  • 第三,需要通过一些计算(例如(2.1)式)才能确定曲线的连续性。

采用如下的形式来表示分段多项式曲线
C ( u ) = ∑ i = 0 n f i ( u ) P i ( 2.2 ) \begin{aligned}\mathbf{C}(u)=\sum\limits_{i=0}^nf_i(u)\mathbf{P}_i\quad(2.2) \end{aligned} C(u)=i=0∑n​fi​(u)Pi​(2.2)​
其中 P i P_i Pi​是控制点(control point); { f i ( u ) , i = 0 , 1 , ⋯ , n } \left\{f_{i}\left(\begin{matrix}{u}\\ \end{matrix}\right),i=0,1,\cdots,n\right\} {fi​(u​),i=0,1,⋯,n}是分段多项式函数,它们构成了定义在给定的断点序列 U = { u i } , ( i = 0 , 1 , ⋯ , m ) U=\{u_i\},(i=0,1,\cdots,m) U={ui​},(i=0,1,⋯,m)上,并具有所要求的次数及(在每个内部断点处)连续性的所有分段多项式函数组成的向量空间的一组基底。注意:上式中曲线的连续性是由基函数的连续性决定的,因此,移动控制点并不改变曲线的连续性。并且, { f i } \{f_i\} {fi​}还应该具有通常所需要的那些优良性质,以确保由(2.2)式定义的曲线具有类似于Bezier曲线的良好的几何性质,例如凸包性、变差减少性、几何不变性等。希望基函数具有的另一个重要性质就是局部支撑性,即每个基函数 f i ( u ) f_i(u) fi​(u)仅在少数几个子区间上,而非在整个定义域 [ u 0 , u m ] [u_0,u_m] [u0​,um​]上非零。由于 P i P_i Pi​被用 f i ( u ) f_i(u) fi​(u)去乘,因此移动控制点 P i P_i Pi​只影响 f i ( u ) f_i(u) fi​(u)的非零子区间上(即 f i ( u ) f_i(u) fi​(u)在该区间上非零)的曲线的形状。

最后,若找到了合适的分段多项式基函数,就可以构造出分段有理多项式曲线
C w ( u ) = ∑ i = 0 n f i ( u ) P i w ( 2.3 ) \mathbf{C}^w(u)=\sum\limits_{i=0}^nf_i(u)\mathbf{P}_i^w\quad(2.3) Cw(u)=i=0∑n​fi​(u)Piw​(2.3)
以及非有理和有理的张量积曲面
S ( u , v ) = ∑ i = 0 n ∑ j = 0 n f i ( u ) g j ( v ) P i , j , S w ( u , v ) = ∑ i = 0 n ∑ j = 0 n f i ( u ) g j ( v ) P i , j w ( 2.4 ) \mathbf{S}(u,v)=\sum\limits_{i=0}^n\sum\limits_{j=0}^nf_i(u){{g}_j}(v)\mathbf{P}_{i,j},\quad\mathbf{S}^w(u,v)=\sum\limits_{i=0}^n\sum\limits_{j=0}^nf_i(u)g_j(v)\mathbf{P}_{i,j}^w\quad(2.4) S(u,v)=i=0∑n​j=0∑n​fi​(u)gj​(v)Pi,j​,Sw(u,v)=i=0∑n​j=0∑n​fi​(u)gj​(v)Pi,jw​(2.4)

B样条基函数:1.引言相关推荐

  1. B样条基函数的定义及系数的意义

    原文链接:http://blog.csdn.net/tuqu/article/details/5177405 贝塞尔基函数用作权重.B-样条基函数也一样:但更复杂.但是它有两条贝塞尔基函数所没有的特性 ...

  2. 用gismo中B样条基函数替代自己写的基函数

    文章目录 前言 一.需要添加[gismo库](https://blog.csdn.net/mw_1422102031/article/details/128966345?spm=1001.2014.3 ...

  3. B样条基函数:2.B样条基函数的定义和性质

    有很多办法可以用来定义B样条基函数以及证明它的一些重要性质.例如,可以采用截尾幂函数的差商定义,开花定义,以及由德布尔.考克斯和曼斯菲尔德等人提出的递推公式等来定义.这里采用递推定义方法,因为这种方法 ...

  4. B-spline Curves 学习之B样条基函数的定义与性质(2)

    转自:http://www.cnblogs.com/icmzn/p/5100761.html B-spline Basis Functions:Definition 贝塞尔基函数用作权重.B-样条基函 ...

  5. 【Matlab】三次B样条基函数插值求解泛函极值问题

    --------------------------------------------------------------------------------------------- 前言:博主是 ...

  6. B-spline曲线基函数计算Matlab程序

    B样条基函数的定义: 沿着下图所示的三角形进行计算: 这是关于B样条基函数的第一个重要的三角形,可以确定基函数的非零节点区间: B样条基函数Ni_j(u)的非零节点区间为[u(i),u(i+j+1)) ...

  7. 样条曲线(下)之插值问题(贝塞尔曲线、B样条和一般样条曲线插值)

    贝塞尔曲线插值与B样条插值 前言: 这篇是"样条曲线"的接续,前面主要集中在了理论部分,这篇文章主要内容是贝塞尔曲线与B样条是如何应用到插值中的. 前篇:样条曲线 文章目录 贝塞尔 ...

  8. 分段多项式及样条估计

    原文链接:https://esl.hohoweiya.xyz/05-Basis-Expansions-and-Regularization/5.2-Piecewise-Polynomials-and- ...

  9. 三次B样条曲线拟合算法

    1 三次B样条曲线方程 B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程.这里会一次介绍两种拟 ...

最新文章

  1. Plugin Error
  2. python while循环语句-Python While 循环语句
  3. Java 集合 之 Vector
  4. 查看grafana版本_使用 Prometheus 与 Grafana 为 Kubernetes 集群建立监控与警报机制
  5. OSPF高级特性——LSA-3(Network Summary LSA)的过滤、路由协议——管理距离的修改、外部路由的metric值的修改
  6. eslint常规语法检
  7. 【docker】宿主机安装kafka docker容器内clickhouse无法连接
  8. 设置Android AI开发环境
  9. 【报告分享】2020中国基民图鉴.pdf(附下载链接)
  10. php 规则路由器,ThinkPHP6路由踩坑之变量规则
  11. 将知网格式的.caj文件转换为.pdf文件
  12. Oracle pmon是什么,oracle 11g pmon工作内容系列二
  13. EJB2.0雨夜教程之一
  14. FITC-LCA荧光素标记小扁豆凝集素(LCA)
  15. Dissect Eclipse Plugin Framework
  16. 微信api接口调用-发朋友圈
  17. 某个个人公众号阅读量和点赞数分析
  18. 单片机加减法计算器_课程设计--十进制加减法计算器单片机设计.doc
  19. Vue项目中操作svg文件
  20. 2020保研夏令营——无科研无竞赛的夏令营之旅

热门文章

  1. 火山应用系列之炫彩模块自制【信息框】
  2. Spring boot锦集(二):整合邮件发送的四种方法 | 纯文本的邮件、带有图片的邮件、带Html的邮件、带附件的邮件(很详细)
  3. Facebook 送你个穿搭师,建议十一出行前查收
  4. 在饥荒服务器中添加并更新mod
  5. JAVA对象、数组转JSON
  6. 视频教程-Unity客户端框架设计PureMVC篇视频课程(下)-Unity3D
  7. batch print pro_研之有效 | 高效编程之Batch批处理程序
  8. 最新电竞馆设计方案(玩家国度电竞解决方案助力西说网络)
  9. 登录系统以后,在Windows服务进程中启动需管理员权限(带盾牌图标)的应用程序
  10. 2023款MacBook Pro M2屏幕参数怎么样 尺寸重量