BSpline曲线逼近
在逼近问题中,曲线的误差界限 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∑nNi,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−1Ni,p(uk)Pi∣∣∣∣∣2k=1∑m−1(Rk−i=1∑n−1Ni,p(uk)Pi)(Rk−i=1∑n−1Ni,p(uk)Pi)k=1∑m−1[Rk⋅Rk−2i=1∑n−1Ni,p(uk)(Rk⋅Pi)+(i=1∑n−1Ni,p(uk)Pi)⋅(i=1∑n−1Ni,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−1Ni,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−1Nl,p(uk)Rk+k=1∑m−1i=1∑n−1Nl,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−1Nl,p(uk)Ni,p(uk))Pi=k=1∑m−1Nl,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=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧p1i=j∑j+p−1ui,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曲线逼近相关推荐
- 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例(2)
前续"问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应--以回旋体的"基本曲线"为例" 之前是保持控制点BCDEF不变,只改变A的位置. ...
- 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例
"问题六十:怎么用ray tracing画回旋体(rotational sweeping / revolution)"中的"基本曲线"是由三次b-spline曲 ...
- 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∑nNi,p(u)Pi ...
- 【OpenGL】使用OpenGL的GLU库绘制BSpline曲线
[OpenGL]使用OpenGL的GLU库绘制BSpline曲线. 1.绘制目标 2.核心代码 3.运行结果 1.绘制目标 使用OpenGL的GLU库绘制BSpline曲线. 2.核心代码 /// T ...
- SLAM--ceres库--曲线逼近示例--啰里啰嗦的代码解析
#include <ceres/ceres.h> #include <iostream> #include <chrono> #include <opencv ...
- B-spline曲线基函数计算Matlab程序
B样条基函数的定义: 沿着下图所示的三角形进行计算: 这是关于B样条基函数的第一个重要的三角形,可以确定基函数的非零节点区间: B样条基函数Ni_j(u)的非零节点区间为[u(i),u(i+j+1)) ...
- 轨迹规划——Bezier曲线与B样条曲线
一.Bezier曲线 1.Bezier曲线的背景 给定n+1个数据点,p0~pn,生成一条曲线,使得该曲线与这些点描述的形状相符. (如果要求曲线通过所有数据点,则属于插值问题:如果只要求曲线逼近这些 ...
- pythonocc进阶学习:曲线拟合(插值 Interpolation/逼近 Approximation)
2d 使用插值法: from OCC.Core.Geom2dAPI import Geom2dAPI_Interpolate from OCC.Core.TColgp import TColgp_HA ...
- 计算机图形学——bazier曲线和B样条曲线
目录 前言 一.bazier曲线 1.bazier曲线的由来 二.B-spline 1.为何要引入B-spline曲线,Bazier曲线有何不足 2.B-spline曲线方法 前言 写这篇文章是因为最 ...
最新文章
- 彩图完美解释:麦克斯韦方程组
- r语言 java mysql_R语言 可不可以取代数据库?
- mysql集群会备份数据吗_mysql集群即双机备份与主从复制
- 下列数据类型中python不支持的是_ 下列选项中 ,Python 不支持的数据类型有 ( ) 。_学小易找答案...
- linux中的bash shell的特性
- HTML浮动导致高度塌陷,HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法(高度欺骗)...
- 两千块钱带来的 quot;希望quot;
- 《布莱克智讯之声》公众号文章汇总
- python-日志模块-logging
- matlab与水库调度,蛙跳算法优化水库调度,全局迭代中最优解未更新
- form data和request payload的区别
- Spring-beans-FactoryBean
- 按钮控制android progressbar,Android ProgressBar手动控制开始和停止
- JavaScript实现单击上一张和下一张按钮切换图片
- Win10怎么提高显卡游戏性能
- 怎么样绘制简易地图,如何制作一个电子地图?
- 支持Micro USB安卓接口与iphone 8手机的5W无线充电芯片|无线快充芯片小封装SOP8外围简单精简
- Bagging你真的懂吗
- 互联网快讯:微信视频号公布MCN招募计划;极米投影产品双十一持续热销;亚马逊计划再发射4538颗卫星
- 论文阅读KMN:Kernelized Memory Network for Video Object Segmentation
热门文章
- 关于火炬之光Demo设计的视频课程
- 通过document.createElement 后,某些设置无反应
- 计算机二级word突出显示,计算机二级word真题:调查报告美化排版
- 996.ICU-加最狠的班,住最贵的医院
- Active Directory简介
- Microsoft Azure——Azure Active Directory
- frida-dexdump Frida 脱壳
- 2022年大连理工大学计算机考研复试时间与复试范围
- 有人知道告诉一声谢谢
- 南邮计算机 双一流,南邮曾憾失211,如今成为双一流,而第四轮学科评估却让人失望?...