在逼近问题中,曲线的误差界限 E E E和要拟合的数据一起被输入。一般预先并不知道需要多少个控制点才能达到预期的精度 E E E,因此逼近一般都需要通过迭代来实现。

给定一个确定的控制点数目,比如 n n n,构造曲线逼近给定的数据。有很多方法可以完成这一任务。例如,可建立一个非线性优化问题,以控制点、参数值 u ‾ k \overline{u}_k uk​、节点甚至权值作为未知量,而要最小化的目标函数通常是某种形式的误差的度量,例如误差的平方和或最大偏差。在下面将介绍的曲线逼近方法中,只有固定数目的控制点是未知的,并且它们通过线性最小二乘技术来求解。

最小二乘曲线逼近

为了避免非线性问题,我们设定权值为1,并预先计算好数据点的参数值和节点矢量,然后,建立线性最小二乘问题来求解未知控制点。假定 p ⩾ 1 , n ⩾ p p\geqslant 1,n\geqslant p p⩾1,n⩾p,并且给定数据点 Q 0 , ⋯ , Q m ( m ⩾ n ) Q_0,\cdots,Q_m \left(m\geqslant n\right) Q0​,⋯,Qm​(m⩾n)。 我们试图寻求一条 p p p次BSpline曲线
C ( u ) = ∑ i = 0 n N i , p ( u ) P i , u ∈ [ 0 , 1 ] C\left(u\right)=\sum^n_{i=0}N_{i,p}\left(u\right)P_i,\quad u\in\left[0,1\right] C(u)=i=0∑n​Ni,p​(u)Pi​,u∈[0,1]
满足条件

∙ Q 0 = C ( 0 ) = P 0 , Q m = C ( 1 ) = P n \bullet\quad Q_0=C(0)=P_0,\ Q_m=C(1)=P_n ∙Q0​=C(0)=P0​, Qm​=C(1)=Pn​;

∙ \bullet\quad ∙其余的数据点 Q k Q_k Qk​在最小二乘的意义下被逼近,即
∑ k = 1 m − 1 ∣ Q k − C ( u ‾ k ) ∣ 2 \sum^{m-1}_{k=1}\left|Q_k-C(\overline{u}_k)\right|^2 k=1∑m−1​∣Qk​−C(uk​)∣2
关于 n + 1 n+1 n+1个变量 P i P_i Pi​达到最小; { u ‾ k } \{\overline{u}_k\} {uk​}是预先计算好的参数值。

在此我们要强调,生成的曲线一般不精确地通过数据点 Q k Q_k Qk​,并且,一般 C ( u ‾ k ) C(\overline{u}_k) C(uk​)不是曲线上与 Q k Q_k Qk​最接近的点。令
R k = Q k − N 0 , p ( u ‾ k ) Q 0 − N n , p ( u ‾ k ) Q m , k = 1 , ⋯ , m − 1 R_k=Q_k-N_{0,p}\left(\overline{u}_k\right)Q_0-N_{n,p}\left(\overline{u}_k\right)Q_m,\quad k=1,\cdots,m-1 Rk​=Qk​−N0,p​(uk​)Q0​−Nn,p​(uk​)Qm​,k=1,⋯,m−1
然后令
f = ∑ k = 1 m − 1 ∣ Q k − C ( u ‾ k ) ∣ 2 = ∑ k = 1 m − 1 ∣ R k − ∑ i = 1 n − 1 N i , p ( u ‾ k ) P i ∣ 2 = ∑ k = 1 m − 1 ( R k − ∑ i = 1 n − 1 N i , p ( u ‾ k ) P i ) ( R k − ∑ i = 1 n − 1 N i , p ( u ‾ k ) P i ) = ∑ k = 1 m − 1 [ R k ⋅ R k − 2 ∑ i = 1 n − 1 N i , p ( u ‾ k ) ( R k ⋅ P i ) + ( ∑ i = 1 n − 1 N i , p ( u ‾ k ) P i ) ⋅ ( ∑ i = 1 n − 1 N i , p ( u ‾ k ) P i ) ] \begin{aligned} f=& \sum^{m-1}_{k=1}|Q_k-C(\overline{u}_k)|^2 =\sum^{m-1}_{k=1}\left|R_k-\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)P_i\right|^2 \\ =& \sum^{m-1}_{k=1}\left(R_k-\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)P_i\right) \left(R_k-\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)P_i\right) \\ =& \sum^{m-1}_{k=1}\left[R_k\cdot R_k -2\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)(R_k\cdot P_i) +\left(\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)P_i\right) \cdot\left(\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)P_i\right)\right] \end{aligned} f===​k=1∑m−1​∣Qk​−C(uk​)∣2=k=1∑m−1​∣∣∣∣∣​Rk​−i=1∑n−1​Ni,p​(uk​)Pi​∣∣∣∣∣​2k=1∑m−1​(Rk​−i=1∑n−1​Ni,p​(uk​)Pi​)(Rk​−i=1∑n−1​Ni,p​(uk​)Pi​)k=1∑m−1​[Rk​⋅Rk​−2i=1∑n−1​Ni,p​(uk​)(Rk​⋅Pi​)+(i=1∑n−1​Ni,p​(uk​)Pi​)⋅(i=1∑n−1​Ni,p​(uk​)Pi​)]​
f f f是关于 n − 1 n-1 n−1个变量 P 1 , ⋯ , P n − 1 P_1,\cdots,P_{n-1} P1​,⋯,Pn−1​的标量值函数。现我们应用标准的线性最小二乘拟合技术,为使目标函数 f f f最小,我们令 f f f关于 n − 1 n-1 n−1个未知控制点 P l P_l Pl​的偏导都等于零。它的第 l l l 个偏导为
∂ f ∂ P l = ∑ k = 1 m − 1 ( − 2 N l , p ( u ‾ k ) R k + 2 N l , p ( u ‾ k ) ∑ i = 1 n − 1 N i , p ( u ‾ k ) P i ) \dfrac{\partial f}{\partial P_l} =\sum^{m-1}_{k=1}\left(-2N_{l,p}(\overline{u}_k)R_k +2N_{l,p}(\overline{u}_k)\sum^{n-1}_{i=1}N_{i,p}(\overline{u}_k)P_i\right) ∂Pl​∂f​=k=1∑m−1​(−2Nl,p​(uk​)Rk​+2Nl,p​(uk​)i=1∑n−1​Ni,p​(uk​)Pi​)
这意味着
− ∑ k = 1 m − 1 N l , p ( u ‾ k ) R k + ∑ k = 1 m − 1 ∑ i = 1 n − 1 N l , p ( u ‾ k ) N i , p ( u ‾ k ) P i = 0 -\sum^{m-1}_{k=1}N_{l,p}(\overline{u}_k)R_k +\sum^{m-1}_{k=1}\sum^{n-1}_{i=1}N_{l,p}(\overline{u}_k)N_{i,p}(\overline{u}_k)P_i =0 −k=1∑m−1​Nl,p​(uk​)Rk​+k=1∑m−1​i=1∑n−1​Nl,p​(uk​)Ni,p​(uk​)Pi​=0
于是
∑ i = 1 n − 1 ( ∑ k = 1 m − 1 N l , p ( u ‾ k ) N i , p ( u ‾ k ) ) P i = ∑ k = 1 m − 1 N l , p ( u ‾ k ) R k \sum^{n-1}_{i=1}\left(\sum^{m-1}_{k=1}N_{l,p}(\overline{u}_k)N_{i,p}(\overline{u}_k)\right)P_i =\sum^{m-1}_{k=1}N_{l,p}(\overline{u}_k)R_k i=1∑n−1​(k=1∑m−1​Nl,p​(uk​)Ni,p​(uk​))Pi​=k=1∑m−1​Nl,p​(uk​)Rk​
这给出了一个以控制顶点 P 1 , ⋯ , P n − 1 P_1,\cdots,P_{n-1} P1​,⋯,Pn−1​为未知量的线性方程。让 l = 1 , 2 , ⋯ , n − 1 l=1,2,\cdots,n-1 l=1,2,⋯,n−1,则得到含 n − 1 n-1 n−1个未知量和 n − 1 n-1 n−1个方程的线性方程组
( N T N ) P = R \left(N^TN\right)P=R (NTN)P=R
这里, N N N是由标量组成的 ( m − 1 ) × ( n − 1 ) \left(m-1\right)\times\left(n-1\right) (m−1)×(n−1)的矩阵
N = [ N 1 , p ( u ‾ 1 ) ⋯ N n − 1 , p ( u ‾ 1 ) ⋮ ⋮ N 1 , p ( u ‾ m − 1 ) ⋯ N n − 1 , p ( u ‾ m − 1 ) ] \begin{aligned} N= \begin{bmatrix} N_{1,p}(\overline{u}_1) & \cdots & N_{n-1,p}(\overline{u}_1) \\ \vdots & & \vdots \\ N_{1,p}(\overline{u}_{m-1}) & \cdots & N_{n-1,p}(\overline{u}_{m-1}) \end{bmatrix} \end{aligned} N=⎣⎢⎡​N1,p​(u1​)⋮N1,p​(um−1​)​⋯⋯​Nn−1,p​(u1​)⋮Nn−1,p​(um−1​)​⎦⎥⎤​​
R R R是由 n − 1 n-1 n−1个点组成的列向量:
R = [ N 1 , p ( u ‾ 1 ) R 1 + ⋯ + N 1 , p ( u ‾ m − 1 ) R m − 1 ⋮ N n − 1 , p ( u ‾ 1 ) R 1 + ⋯ + N n − 1 , p ( u ‾ m − 1 ) R m − 1 ] \begin{aligned} R= \begin{bmatrix} N_{1,p}(\overline{u}_1)R_1 +\cdots +N_{1,p}(\overline{u}_{m-1})R_{m-1} \\ \vdots \\ N_{n-1,p}(\overline{u}_1)R_1 +\cdots +N_{n-1,p}(\overline{u}_{m-1})R_{m-1} \end{bmatrix} \end{aligned} R=⎣⎢⎡​N1,p​(u1​)R1​+⋯+N1,p​(um−1​)Rm−1​⋮Nn−1,p​(u1​)R1​+⋯+Nn−1,p​(um−1​)Rm−1​​⎦⎥⎤​​
并且
P = [ P 1 ⋮ P n − 1 ] \begin{aligned} P= \begin{bmatrix} P_1 \\ \vdots \\ P_{n-1} \end{bmatrix} \end{aligned} P=⎣⎢⎡​P1​⋮Pn−1​​⎦⎥⎤​​
为了求解线性方程组计算控制点,需要知道各数据点的参数值 { u ‾ k } \{\overline{u}_k\} {uk​}和节点矢量 U = { u 0 , u 1 , ⋯ , u n + p + 1 } U=\{u_0,u_1,\cdots,u_{n+p+1}\} U={u0​,u1​,⋯,un+p+1​}。

数据点的参数化

弦长参数化法计算 { u ‾ k } \{\overline{u}_k\} {uk​}:令 d d d为总弦长
d = ∑ k = 1 m ∣ Q k − Q k − 1 ∣ d=\sum^m_{k=1}|Q_k-Q_{k-1}| d=k=1∑m​∣Qk​−Qk−1​∣
则 u ‾ 0 = 0 , u ‾ m = 1 \overline{u}_0=0,\ \overline{u}_m=1 u0​=0, um​=1
u ‾ k = u ‾ k − 1 + ∣ Q k − Q k − 1 ∣ d , k = 1 , 2 , ⋯ , m − 1 \overline{u}_k =\overline{u}_{k-1}+\dfrac{|Q_k-Q_{k-1}|}{d},\quad k=1,2,\cdots,m-1 uk​=uk−1​+d∣Qk​−Qk−1​∣​,k=1,2,⋯,m−1

节点配置

根据端点插值与曲线定义域要求,节点矢量 U = [ u 0 , u 1 , ⋯ , u n + p + 1 ] U=\left[u_0,u_1,\cdots,u_{n+p+1}\right] U=[u0​,u1​,⋯,un+p+1​] 常采用定义域两端节点为 p + 1 p+1 p+1重的重节点端点条件,也即固支条件。于是有 u 0 = u 1 = ⋯ = u p = 0 u_0=u_1=\cdots=u_p=0 u0​=u1​=⋯=up​=0和 u n + 1 = u n + 2 = ⋯ = u n + p + 1 = 1 u_{n+1}=u_{n+2}=\cdots=u_{n+p+1}=1 un+1​=un+2​=⋯=un+p+1​=1。现在的问题是怎样确定所含内节点数和内节点值,也即怎样进行节点配置以确定节点矢量。

节点的选择对生成的逼近曲线的形状有很大的影响,不合理的节点矢量可能导致不可接受的形状。因此,BSpline曲线逼近成功的关键在于尽可能给出合适的节点配置。皮格尔和蒂勒推荐采用如下的方法:
u p + j = { 1 p ∑ i = j j + p − 1 u ‾ i , m = n ( 1 − α ) u ‾ i − 1 + α u ‾ i , m > n ( j = 1 , 2 , ⋯ , n − p ) 其 中 : i = i n t ( j c ) , c = m + 1 n − p + 1 , α = j c − i \begin{aligned} u_{p+j}= \begin{cases} \dfrac{1}{p}\sum\limits^{j+p-1}_{i=j}\overline{u}_i,\quad m=n \\ (1-\alpha)\overline{u}_{i-1}+\alpha\overline{u}_i,\quad m>n\ (j=1,2,\cdots,n-p) \\ 其中:i=int(jc),\ c=\dfrac{m+1}{n-p+1},\ \alpha=jc-i \end{cases} \end{aligned} up+j​=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​p1​i=j∑j+p−1​ui​,m=n(1−α)ui−1​+αui​,m>n (j=1,2,⋯,n−p)其中:i=int(jc), c=n−p+1m+1​, α=jc−i​​
此即用于 m = n m=n m=n时的平均技术即AVG技术和用于 m > n m>n m>n时的节点配置技术 ( ( (the knot placement technique,KTP技术 ) ) )。 可见这一套方法包括插值 ( m = n ) (m=n) (m=n)和逼近 ( m > n ) (m>n) (m>n)两种情况,这里把插值 ( m = n ) (m=n) (m=n)作为特殊情况进行特殊处理,内节点值取顺序 p p p个参数值的算术平均。而在逼近 ( m > n ) (m>n) (m>n)情况下,采用另一种不同的平均方法即 ( m + 1 ) / ( n − p + 1 ) (m+1)/(n-p+1) (m+1)/(n−p+1)和据此决定的 α \alpha α对顺序两参数值的加权平均,据此决定的内节点值保证了定义域每个节点区间包含至少一个 u ‾ \overline{u} u。 德布尔表明在这样确定内节点的条件下,矩阵 ( N T N ) \left(N^TN\right) (NTN)对角占优,有一个小于 p + 1 p+1 p+1的带宽。 ( N T N ) \left(N^TN\right) (NTN)是正定的和情况良好的,这给出了一个稳定方程组,可由高斯消元法求解。

BSpline曲线逼近相关推荐

  1. 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例(2)

    前续"问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应--以回旋体的"基本曲线"为例" 之前是保持控制点BCDEF不变,只改变A的位置. ...

  2. 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例

    "问题六十:怎么用ray tracing画回旋体(rotational sweeping / revolution)"中的"基本曲线"是由三次b-spline曲 ...

  3. B-Spline曲线的导数

    样条曲线定义: C ( u ) = ∑ i = 0 n N i , p ( u ) P i C(u)=\sum^n_{i=0}N_{i,p}(u)P_i C(u)=i=0∑n​Ni,p​(u)Pi​ ...

  4. 【OpenGL】使用OpenGL的GLU库绘制BSpline曲线

    [OpenGL]使用OpenGL的GLU库绘制BSpline曲线. 1.绘制目标 2.核心代码 3.运行结果 1.绘制目标 使用OpenGL的GLU库绘制BSpline曲线. 2.核心代码 /// T ...

  5. SLAM--ceres库--曲线逼近示例--啰里啰嗦的代码解析

    #include <ceres/ceres.h> #include <iostream> #include <chrono> #include <opencv ...

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

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

  7. 轨迹规划——Bezier曲线与B样条曲线

    一.Bezier曲线 1.Bezier曲线的背景 给定n+1个数据点,p0~pn,生成一条曲线,使得该曲线与这些点描述的形状相符. (如果要求曲线通过所有数据点,则属于插值问题:如果只要求曲线逼近这些 ...

  8. pythonocc进阶学习:曲线拟合(插值 Interpolation/逼近 Approximation)

    2d 使用插值法: from OCC.Core.Geom2dAPI import Geom2dAPI_Interpolate from OCC.Core.TColgp import TColgp_HA ...

  9. 计算机图形学——bazier曲线和B样条曲线

    目录 前言 一.bazier曲线 1.bazier曲线的由来 二.B-spline 1.为何要引入B-spline曲线,Bazier曲线有何不足 2.B-spline曲线方法 前言 写这篇文章是因为最 ...

最新文章

  1. 彩图完美解释:麦克斯韦方程组
  2. r语言 java mysql_R语言 可不可以取代数据库?
  3. mysql集群会备份数据吗_mysql集群即双机备份与主从复制
  4. 下列数据类型中python不支持的是_ 下列选项中 ,Python 不支持的数据类型有 ( ) 。_学小易找答案...
  5. linux中的bash shell的特性
  6. HTML浮动导致高度塌陷,HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法(高度欺骗)...
  7. 两千块钱带来的 quot;希望quot;
  8. 《布莱克智讯之声》公众号文章汇总
  9. python-日志模块-logging
  10. matlab与水库调度,蛙跳算法优化水库调度,全局迭代中最优解未更新
  11. form data和request payload的区别
  12. Spring-beans-FactoryBean
  13. 按钮控制android progressbar,Android ProgressBar手动控制开始和停止
  14. JavaScript实现单击上一张和下一张按钮切换图片
  15. Win10怎么提高显卡游戏性能
  16. 怎么样绘制简易地图,如何制作一个电子地图?
  17. 支持Micro USB安卓接口与iphone 8手机的5W无线充电芯片|无线快充芯片小封装SOP8外围简单精简
  18. Bagging你真的懂吗
  19. 互联网快讯:微信视频号公布MCN招募计划;极米投影产品双十一持续热销;亚马逊计划再发射4538颗卫星
  20. 论文阅读KMN:Kernelized Memory Network for Video Object Segmentation

热门文章

  1. 关于火炬之光Demo设计的视频课程
  2. 通过document.createElement 后,某些设置无反应
  3. 计算机二级word突出显示,计算机二级word真题:调查报告美化排版
  4. 996.ICU-加最狠的班,住最贵的医院
  5. Active Directory简介
  6. Microsoft Azure——Azure Active Directory
  7. frida-dexdump Frida 脱壳
  8. 2022年大连理工大学计算机考研复试时间与复试范围
  9. 有人知道告诉一声谢谢
  10. 南邮计算机 双一流,南邮曾憾失211,如今成为双一流,而第四轮学科评估却让人失望?...