精华内容
下载资源
问答
  • matlabB样条曲线求导求曲率

    千次阅读 2019-05-07 10:58:35
    原文:...function result = BspCurv( C,U,t,k) % %CURVATURE B样条曲线在t点曲率 %C控制点,U节点序列,U(k)<=t<U(k+1) % %see also http://www.matlabsky.com % dev1=0; dev2=0; %%计算...

    原文:http://www.matlabsky.com/thread-665-1-1.html

    function result = BspCurv( C,U,t,k)

    %

    %CURVATURE B样条曲线在t点曲率

    %C控制点,U节点序列,U(k)<=t<U(k+1)

    %

    %see also http://www.matlabsky.com

    %

    dev1=0;

    dev2=0;

    %%计算一阶导数

    for i=k-2:k

    dev1=dev1+DeBoorDv(C,U,t,i,1)*Bbase(i,2,U,t);
    

    end

    %计算二阶导数

    for i=k-1:k

    dev2=dev2+DeBoorDv(C,U,t,i,2)*Bbase(i,1,U,t);
    

    end

    %计算曲率

    temp=norm(dev1)^3;

    if temp==0

    result=NaN;
    

    else

    result=det( cat(1,dev1,dev2))/temp;
    

    end

    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

    %

    %

    function y=DeBoorDv(d,u,kn,i,L)

    %递归求导数控制点,德布尔递推算法

    %

    %d控制点序列,u节点序列,kn插入的节点,u(i)<kn<u(i+1),L递推层次

    % k B样条次数

    %

    %see also http://www.matlabsky.com

    %

    k=3;

    if L==0

     y=d(i,:);
    
     return;
    

    end

    temp=(u(i+k+1-L)-u(i));

    if temp==0

     y=0;
    

    else

     y=(k+1-L)*(DeBoorDv(d,u,kn,i,L-1)-DeBoorDv(d,u,kn,i-1,L-1))/temp;
    

    end

    展开全文
  • 2次B样条曲线和3次B样条曲线matlab绘制,适用于初学者
  • matlab三次样条曲线的绘制(spline和csape函数详解)

    万次阅读 多人点赞 2018-12-05 22:30:29
    matlab三次样条函数的绘制(spline和csape函数详解) 样条函数是工程中常用的插值函数。早期工程师制图时,把富有弹性的细长木条...由于样条曲线具有连续的二阶导数,所以光滑性好。matlab里有两个函数可以绘制样...


    2020年10月更新说明:
    1 spline和csape函数都拥有“非节终止条件”这个边界条件,这个边界条件并非指定二阶导数为常数0,这里感谢评论区Cherry_zzz的指正,在文章中也有所修改。
    2 关于第一边界条件和第二边界条件究竟哪个是约束一阶导数哪个是约束二阶导数的,我这里是以颜庆津的《数值分析(第四版)》作为参考。具体定义我已经在前言处说明,。

    前言

    样条函数是工程中常用的插值函数。早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿木条画下曲线。对于样条本身,可以利用材料力学的大柔度梁理论建立梁的挠度方程,根据理论,样条可以用分段插值三次函数表示。

    由于样条曲线具有连续的二阶导数,所以光滑性好。matlab里有两个函数可以绘制样条曲线,一个是spline,一个是csape。虽然interp1中也可以绘制,优点是代码简单而且可以方便更换其它插值方法,但是功能也比较简单,对于边界条件的无法设置。
    关于interp1可以参见官方帮助https://ww2.mathworks.cn/help/matlab/ref/interp1.html

    三次样条曲线有4种边界条件。

    1. 自然边界条件,二阶导数在边界处为0,可视为简支梁,是最常用的边界条件。
    2. 第一边界条件,二阶导在边界处已知的边界条件。自然边界条件可视为特例。
    3. 第二边界条件,一阶导在边界处已知的边界条件。
    4. 循环边界条件,一阶导与二阶导在边界处相等的边界条件,适用于封闭或循环的图形。

    如果既有第一边界由于第二边界,称为混合边界条件。

    1.spline函数详解

    spline函数只能实现非节点边界(Not-A-Knot)和约束导数的第二边界条件,可以实现一维或者高维的曲线插值。
    官方spline实例可以参见:https://ww2.mathworks.cn/help/matlab/ref/spline.html

    1.一维非节点边界

    非节点边界(Not-A-Knot)的原理可以参考下面的文章:

    三次样条插值(Cubic Spline Interpolation)及代码实现(C语言)

    格式cs=spline(x,y);
    输入:x自变量,y函数值
    输出:cs为三维样条插值函数构建的结构体。

    cs结构体调用方法为yy=ppval(cs,xx);
    xx为插值点,yy为插值得到的函数值。

    %正弦曲线
    r=pi*linspace(-1,1,100);
    yr=sin(xr);
    %1非节点边界条件
    x = pi*linspace(-1,1,5);%设置5个控制点
    y = sin(x);
    cs = spline(x,y);%样条函数
    xx = linspace(x(1),x(end),100);%插值点
    yy=ppval(cs,xx);%插值
    figure(1)
    plot(x,y,'bo',xr,yr,'b--',xx,yy,'r-');%绘图
    

    在这里插入图片描述
    红线为插值函数,蓝线为实际正弦函数。

    2.第二边界条件

    曲线依然选用上面的曲线,我们使用约束导数的第二边界条件。
    这里依然用上一个xr和yr正弦曲线。y’(-pi)=1,y’(pi)=0。
    第二边界条件(导数条件)格式为:
    cs=spline(x , [y’1, y, y’2]);

    当y比x的长度多2个时,把第一个值和最后一个值当做函数边界的导数。
    比如下面代码中,这里x有5个值,y在spline函数中在第一和最后分别增加了1个值作为导数值,第一个值为1,对应y’(-pi)=1;最后一个值为0,对应y’(pi)=0。

    %2第二种边界条件,导数确定的
    cs2 = spline(x,[1,y,0]);
    xx = linspace(x(1),x(end),100);
    yy=ppval(cs2,xx);
    figure(2)
    plot(x,y,'bo',xr,yr,'b--',xx,yy,'r-');
    

    在这里插入图片描述
    可以看到插值函数被大大改变。

    如果想要验证y’(-pi)=1,取(yy(2)-yy(1))/(xx(2)-xx(1)),得0.87(这里不是1的原因是xx太稀疏,xx间隔取越密,越接近1)。

    3.高维无约束

    这里以二维为例。这里选用默认的非节点边界条件。

    二维格式为:
    cs=spline(t,XY);
    输入t为一个正向序列,需要单调。
    输入XY为2行n列的矩阵,第一行为x,第二行为y。
    cs依然是输出的结构体,但是后面利用ppval插值时要代入关于t的序列值。

    XY=[1.1,1,0,-1,0,1,1.1;
        2,1,2,0,-2,-1,-2];
    t=1:length(XY);%输入XY和t
    cs3=spline(t,XY);%样条函数
    yy=ppval(cs3,linspace(t(1),t(end),101));%插值
    figure(3)
    plot(XY(1,:),XY(2,:),'bo',yy(1,:),yy(2,:))
    

    在这里插入图片描述

    4.高维第二边界

    由于1维不能表述当y’(x)=inf的情况(如果输入inf时函数会报错),所以可以利用二维来实现导数为无穷大时的约束。

    对于二维情况,导数的表达用向量的形式代替,比如k=1可以表示为(0.707,0.707),k=∞可以用(0,1)表示。

    表达格式为
    cs=spline(t , [xy’1, xy, xy’2]);
    t为序列
    xy为坐标,xy’1为第一个点的导数列向量,xy’2为最后一个点的导数列向量

    这里第一个点和最后一个点都取负无穷(0 ; -1)

    %4高维有斜率约束
    %这里用3的t和XY
    cs4=spline(t,[[0;-1],XY,[0;-1]]);
    yy=ppval(cs4,linspace(t(1),t(end),101));
    figure(4)
    plot(XY(1,:),XY(2,:),'bo',yy(1,:),yy(2,:))
    

    在这里插入图片描述
    可以看到有负无穷约束的条件下,改善了图形向外弯折。

    5.利用第二边界条件绘制圆

    虽然圆是一个封闭图形,需要用到循环边界条件,但是如果我们已知圆一点处的导数,还是可以间接的利用这点的导数去做一个伪循环条件的。

    比如在(1,0)点处作为初始点,逆时针一圈回到(1,0)点。两边一阶导均为正无穷。算法实现如下:

    %5圆形绘制
    t = pi*linspace(0,2,7);
    XY=[cos(t);sin(t)];
    cs5=spline(t,[[0;1],XY,[0;1]]);
    yy=ppval(cs5,linspace(t(1),t(end),101));
    figure(5)
    plot(XY(1,:),XY(2,:),'bo',yy(1,:),yy(2,:))
    

    在这里插入图片描述

    2.csape函数详解

    csape函数可以实现三次样条曲线的各种条件,包括第一边界、第二边界、循环边界、混合边界、非节点边界等。可以实现一维至多维的各种情况。

    1.自然边界条件

    可以采用
    cs =csape(x,y,‘variational’)

    2.第一边界条件

    调用格式:
    cs = csape(x , [y’‘1 , y , y’‘2] , [2 , 2] )
    其中x、y和y’'1(2)和之前定义都一样,是约束值,只是这个函数多了一项。
    第三项,即[2,2]代表第一个值和最后一个值,都是样条函数的2阶导数值约束条件。

    举例为

    %采用cs1的x和y值,即正弦曲线值
    cs6 = csape(x,[5,y,5],[2,2]);%样条插值
    xx = linspace(x(1),x(end),100);
    yy=ppval(cs6,xx);
    figure(6)
    plot(x,y,'bo',xr,yr,'b--',xx,yy,'r-');
    

    在这里插入图片描述

    3.第二边界条件&混合边界条件

    这里第三项取[1,1]即为第二边界条件,即1阶导数约束点。
    如果取[1,2]或[2,1]即为混合边界条件。

    这里仅用第二边界举例

    cs7 = csape(x,[-1,y,-1],[1,1]);
    xx = linspace(x(1),x(end),100);
    yy=ppval(cs7,xx);
    figure(7)
    plot(x,y,'bo',xr,yr,'b--',xx,yy,'r-');
    

    在这里插入图片描述
    可以看到和之前用二阶导等于0约束相比,用一阶导都等于-1的精度要更高。

    4.二维循环边界条件

    这里csape函数高维的调用格式依然同spline,具体参见前面的例子。

    这里第三项为[0,0]时,代表循环边界条件,不仅适用于1维,还适用于更高维。
    比如还是那绘制圆形举例:

    %9二维自然条件
    t = pi*linspace(0,2,5);
    XY=[cos(t);sin(t)];
    cs9=csape(t,XY);
    yy=ppval(cs9,linspace(t(1),t(end),101));
    figure(9)
    plot(XY(1,:),XY(2,:),'bo',yy(1,:),yy(2,:))
    axis equal
    
    %10二维循环
    cs10=csape(t,XY,[0,0]);%只多了第三项
    yy=ppval(cs10,linspace(t(1),t(end),101));
    figure(10)
    plot(XY(1,:),XY(2,:),'bo',yy(1,:),yy(2,:))
    

    在这里插入图片描述
    在(1,0)点自然无约束条件↑↑↑。
    在这里插入图片描述
    在(1,0)点循环约束↑↑↑。

    展开全文
  • MATLAB绘制B样条曲线代码,M文件的形式
  • %多项式曲线拟合 figure(1) matrix2=[]; %新建空矩阵 h1=polyfit(matrix1(:,1),matrix1(:,2),3); %计算多项式拟合系数,3-拟合次数 matrix2(:,1)=polyval(h1,matrix1(:,1),1); %计算拟合函数值y plot(matrix1(:,1),...

    %多项式曲线拟合
    figure(1)
    matrix2=[]; %新建空矩阵
    h1=polyfit(matrix1(:,1),matrix1(:,2),3); %计算多项式拟合系数,3-拟合次数
    matrix2(:,1)=polyval(h1,matrix1(:,1),1); %计算拟合函数值y
    plot(matrix1(:,1),matrix2(:,1)) %绘制拟合曲线
    title(‘Predicred realations between noncoaxiality and bedding angle’); %标题
    set(gca,‘FontName’,‘Time New Roman’,‘fontsize’,12) %字体
    %legend(’\rho-\theta’) %图例
    xlabel(‘Bedding angle \theta[^\o]’) %x坐标名称
    ylabel(‘Angle of noncoaxiality \rho[^\o]’) %y坐标名称
    xlim([0,90]) %限制x坐标绘图范围
    ylim([0,5]) %限制y坐标绘图范围
    set(gca,‘XTick’,(0:10:90)) %设置x坐标间隔
    set(gca,‘YTick’,(0:1:5)) %设置y坐标间隔

    %样条曲线拟合
    figure(2)
    values = spcrv([[matrix1(1,1)’ matrix1(:,1)’ matrix1(end,1)’]; [matrix1(1,2)’ matrix1(:,2)’ matrix1(end,2)’]],3); %三次样条曲线拟合
    plot(values(1,:),values(2,:), ‘b’); %绘制曲线
    title(‘Predicred realations between noncoaxiality and bedding angle’);
    set(gca,‘FontName’,‘Time New Roman’,‘fontsize’,12)
    xlabel(‘Bedding angle \theta[^\o]’)
    ylabel(‘Angle of noncoaxiality \rho[^\o]’)
    xlim([0,90])
    ylim([0,5])
    set(gca,‘XTick’,(0:10:90))
    set(gca,‘YTick’,(0:1:5))

    展开全文
  • MATLAB绘制B样条曲线

    万次阅读 多人点赞 2017-03-09 23:38:02
    B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法(NURBS)的基础。B样条方法兼备了Bezier方法的一切优点,包括几何...

    转载自:http://blog.csdn.net/Mr_Grit/article/details/45603627

    B样条曲线

    B样条曲线定义

    B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法(NURBS)的基础。B样条方法兼备了Bezier方法的一切优点,包括几何不变性,仿射不变性等等,同时克服了Bezier方法中由于整体表示带来不具有局部性质的缺点(移动一个控制顶点将会影响整个曲线)。B样条曲线方程可写为: 

    p(u)=i=0ndiNi,k(u)

    其中, di(i=0,1...n) 为控制顶点(坐标), Ni,k(i=0,1...n) k 次规范B样条基函数,最高次数是 k 。基函数是由一个称为节点矢量的非递减参数 u 的序列 U u0u1...un+k+1 所决定的 k 次分段多项式。 
    B样条的基函数通常采用Cox-deBoor递推公式: 
    Ni,0(u)={1,  if  uiuui+10,  othersNi,k=uuiui+kuiNi,k1(u)+ui+k+1uui+k+1ui+1Ni+1,k1(u)define  00=0

    式中  i  为节点序号,  k  是基函数的次数,共有 n+1 个控制顶点。 注意区分节点和控制顶点,节点是在节点矢量 U 中取得,控制顶点则是坐标点,决定B样条的控制多边形 。Cox-deBoor递推公式是B样条曲线的定义的核心,该部分在程序中实现可采用递归的方式:

    % BaseFunction.m文件
    function Nik_u = BaseFunction(i, k , u, NodeVector)
    % 计算基函数Ni,k(u),NodeVector为节点向量
    
    if k == 0       % 0次B样条
        if (u >= NodeVector(i+1)) && (u < NodeVector(i+2))
            Nik_u = 1.0;
        else
            Nik_u = 0.0;
        end
    else
        Length1 = NodeVector(i+k+1) - NodeVector(i+1);
        Length2 = NodeVector(i+k+2) - NodeVector(i+2);      % 支撑区间的长度
        if Length1 == 0.0       % 规定0/0 = 0
            Length1 = 1.0;
        end
        if Length2 == 0.0
            Length2 = 1.0;
        end
        Nik_u = (u - NodeVector(i+1)) / Length1 * BaseFunction(i, k-1, u, NodeVector) ...
            + (NodeVector(i+k+2) - u) / Length2 * BaseFunction(i+1, k-1, u, NodeVector);
    end
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    所给程序可用于计算基函数 Ni,k(u) 的值,程序中对不同类型的B样条曲线区别在于节点矢量 NodeVector 的取值不同。

    B样条曲线的分类

    根据节点矢量中节点的分布情况不同,可以划分4中类型的B样条曲线: 

    1. 均匀B样条曲线 
    节点矢量中节点为沿参数轴均匀或等距分布。 
    2. 准均匀B样条曲线 
    其节点矢量中两端节点具有重复度 k+1 ,即 u0=u1=...=uk un+1=un+2=...=un+k+1 ,所有的内节点均匀分布,具有重复度1。 
    3. 分段Bezier曲线 
    其节点矢量中两端节点的重复度与类型2相同,为 k+1 。不同的是内节点重复度为 k 。该类型有限制条件,控制顶点数减1必须等于次数的正整数倍,即 nk= 。 
    4. 一般非均匀B样条曲线 
    对任意分布的节点矢量 U=[u0,u1...un+k+1] ,只要在数学上成立都可选取。

    B样条曲线的绘制

    节点矢量的确定

    不同类型的B样条曲线区别主要在于节点矢量,对于具有 n+1 个控制顶点 (P0,P1,...,Pn) 的  k  次B样条曲线,无论是哪种类型都具有 n+k+2 个节点 ([u0,u1...un+k+1])

    $n=4,k=2时不同类型的节点矢量$

    根据图示,三种类型的B样条曲线对应的节点矢量分别为: 

    [01727374757671]
    [0 0 013231 1 1]
    [0 0 012121 1 1]
    需要注意的是分段Bezier曲线必须满足 nk=

    这里给出准均匀B样条和分段Bezier曲线的生成节点矢量的代码,均匀B样条的很简单就不列出了。假设共n+1个控制顶点,k次B样条,输入参数为 n, k ,输出节点矢量NodeVector。


    准均匀B样条曲线的节点矢量生成:

    % U_quasi_uniform.m文件
    function NodeVector = U_quasi_uniform(n, k)
    % 准均匀B样条的节点向量计算,共n+1个控制顶点,k次B样条
    NodeVector = zeros(1, n+k+2);
    piecewise = n - k + 1;       % 曲线的段数
    if piecewise == 1       % 只有一段曲线时,n = k
        for i = n+2 : n+k+2
            NodeVector(1, i) = 1;
        end
    else
        flag = 1;       % 不止一段曲线时
        while flag ~= piecewise
            NodeVector(1, k+1+flag) = NodeVector(1, k + flag) + 1/piecewise;
            flag = flag + 1;
        end
        NodeVector(1, n+2 : n+k+2) = 1;
    end
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    分段Bezier曲线的节点矢量生成:

    % U_piecewise_Bezier.m文件
    function NodeVector = U_piecewise_Bezier(n, k)
    % 分段Bezier曲线的节点向量计算,共n+1个控制顶点,k次B样条
    % 分段Bezier端节点重复度为k+1,内间节点重复度为k,且满足n/k为正整数
    
    if ~mod(n, k) && (~mod(k, 1) && k>=1)   % 满足n是k的整数倍且k为正整数
        NodeVector = zeros(1, n+k+2);   % 节点矢量长度为n+k+2
        NodeVector(1, n+2 : n+k+2) = ones(1, k+1);  % 右端节点置1
    
        piecewise = n / k;      % 设定内节点的值
        Flg = 0;
        if piecewise > 1
            for i = 2 : piecewise
                for j = 1 : k
                    NodeVector(1, k+1 + Flg*k+j) = (i-1)/piecewise;
                end
                Flg = Flg + 1;
            end
        end
    
    else
        fprintf('error!\n');
    end
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    B样条曲线的绘制

    根据B样条曲线的定义公式,曲线上任一点坐标值是参数变量u的函数,用矩阵形式表示


    p(u)=(d0d1dn)N0,k(u)N1,k(u)Nn,k(u)
    只需要确定 控制顶点 di 、曲线的次数 k  以及基函数 Ni,k(u) ,就完全确定了曲线。


    B样条曲线的绘制函数:

    % DrawSpline.m文件
    function DrawSpline(n, k, P, NodeVector)
    % B样条的绘图函数
    % 已知n+1个控制顶点P(i), k次B样条,P是2*(n+1)矩阵存控制顶点坐标, 节点向量NodeVector
    plot(P(1, 1:n+1), P(2, 1:n+1),...
                        'o','LineWidth',1,...
                        'MarkerEdgeColor','k',...
                        'MarkerFaceColor','g',...
                        'MarkerSize',6);
    line(P(1, 1:n+1), P(2, 1:n+1));
    Nik = zeros(n+1, 1);
    for u = 0 : 0.005 : 1-0.005
        for i = 0 : 1 : n
            Nik(i+1, 1) = BaseFunction(i, k , u, NodeVector);
        end
        p_u = P * Nik;
        if u == 0
            tempx = p_u(1,1);
            tempy = p_u(2,1);
            line([tempx p_u(1,1)], [tempy p_u(2,1)],...
                'Marker','.','LineStyle','-', 'Color',[.3 .6 .9], 'LineWidth',3);
        else
            line([tempx p_u(1,1)], [tempy p_u(2,1)],...
                'Marker','.','LineStyle','-', 'Color',[.3 .6 .9], 'LineWidth',3);
            tempx = p_u(1,1);
            tempy = p_u(2,1);
        end
    end
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    调用 DrawSpline(n, k, P, NodeVector) 函数就能绘制曲线,注意输入变量要正确。

    —————————————————————————————————————————————————————————————

    下面给出绘制三种不同B样条曲线的命令流,可以参考比较每种类型之间的区别。

    % 绘制三种类型的B样条曲线,需要前面所给的所有.m文件
    clear all;
    %控制顶点
    P = [9.036145, 21.084337, 37.607573, 51.893287, 61.187608;
        51.779661, 70.084746, 50.254237, 69.745763, 49.576271];
    
    n = 4; k = 2;
    
    flag = 2;
    % flag = 1,绘制均匀B样条曲线
    % flag = 2, 绘制准均匀B样条曲线
    % flag = 3, 绘制分段Bezier曲线
    
    switch flag
        case 1
            NodeVector = linspace(0, 1, n+k+2); % 均匀B样条的节点矢量
    
            % 绘制样条曲线
            plot(P(1, 1:n+1), P(2, 1:n+1),...
                            'o','LineWidth',1,...
                            'MarkerEdgeColor','k',...
                            'MarkerFaceColor','g',...
                            'MarkerSize',6);
            line(P(1, 1:n+1), P(2, 1:n+1));
            Nik = zeros(n+1, 1);
            for u = k/(n+k+1) : 0.001 : (n+1)/(n+k+1)
                % for u = 0 : 0.005 : 1
                for i = 0 : 1 : n
                    Nik(i+1, 1) = BaseFunction(i, k , u, NodeVector);
                end
            p_u = P * Nik;
            line(p_u(1,1), p_u(2,1), 'Marker','.','LineStyle','-', 'Color',[.3 .6 .9]);
            end
        case 2
            NodeVector = U_quasi_uniform(n, k); % 准均匀B样条的节点矢量
            DrawSpline(n, k, P, NodeVector);
        case 3
            NodeVector = U_piecewise_Bezier(n, k);  % 分段Bezier曲线的节点矢量
            DrawSpline(n, k, P, NodeVector);
        otherwise
            fprintf('error!\n');
    end
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    三种类型的B样条曲线: 

    1. 均匀B样条曲线 

    均匀B样条曲线 

    2. 准均匀B样条曲线 

    准均匀B样条曲线 

    3. 分段Bezier曲线 

    分段Bezier曲线

    参考文献:

    [1] 施法中. 计算机辅助几何设计与非均匀有理B样条(修订版)[M]. 北京: 高等教育出版社, 2013 : 217-248.


    展开全文
  • 五次B样条曲线MATLAB程序,B样条曲线除了保持Bezier曲线所具有的有点外,还增加了可以对曲线进行局部修改这一突出的优点。除此之外,它还具有对特征多边形更逼近以及多项式阶次较低等优点。因此,B样条曲线在外形...
  • 用鼠标点击图片上的点,即可根据所选的点生成相应的贝塞尔曲线B样条曲线
  • [2](这个介绍只有两个插值点的三次B样条曲线,是B样条曲线最简单的形式了吧~)(7条消息) 从B样条的插值点反求控制点_cofd的专栏-CSDN博客 [3](一本书,里面有讲到整体参数和局部参数设置、节点矢量划分等)...
  • 样条实验室 用于 B 样条曲线的交互式 MATLAB 工具
  • 样条拟合: - 基于B样条的曲线拟合工具- ppform 上的样条(分段多项式) - 任何样条顺序(默认三次样条) - 周期性边界条件- 函数值和导数的线性约束- 稳健的拟合方案- 以与 SPLINE 相同的方式在 ND 阵列上运行- ...
  • MATLAB样条工具箱可以通过节点获得样本函数值,但不能根据x求y或z,也不能求得样本曲线方程。例如:ctrlpoints=[0 -1.2 -1.6 -1.4 -1 -0.5 -0.35-0.6 -1.6-0.2 -0.5-1 -1.5-2.2 -2.7-3.2 -3.7-4.2];knots=[0 0 0 0 1...
  • matlab三次样条函数的绘制(spline和csape函数详解)样条函数是工程中常用的插值函数。早期工程师制图时,把富有弹性的细长木条...由于样条曲线具有连续的二阶导数,所以光滑性好。matlab里有两个函数可以绘制样条曲...
  • 机械臂的轨迹规划可分为在笛卡尔空间中和在关节空间中规划两种, 前者优点是概念 直观, 便于理解 ,但该方法涉及大量的笛卡尔空间与关节空间的大转称 ,求逆矩阵, 计算量大 ,并且所用传感器不能直接测出机械臂在笛卡尔...
  • Matlab三次均匀B样条曲线插值函数

    热门讨论 2014-03-25 11:25:23
    对给定的点进行三次B样条插值,得到插值曲线,这里给定的点可以是二维平面上的点或三维点,注意输入的点矩阵要每行为一个点坐标,里面都有注释,可以自己简单修改封装成自己想要的带参函数,里面有测试的点数据,...
  • 在工程上往往需要进行三维曲线拟合,该Matlab代码可以对三组离散数据进行三维B样条曲线拟合
  • %多项式曲线拟合figure(1)matrix2=[]; %新建空矩阵h1=polyfit(matrix1(:,1),matrix1(:,2),3); %计算多项式拟合系数,3-拟合次数matrix2(:,1)=polyval(h1,matrix1(:,1),1); %计算拟合函数值yplot(matrix1(:,1),matrix...
  • 提出了将颜色特征中的分块主色法,纹理特征中的分块灰度共生矩阵以及相关反馈技术相结合来共同进行检索,并采用相关反馈技术通过更新权值的方法来调整图像颜色、纹理特征系数以及对应于这两种特征的图像各分块的权值...
  • 例程: x = [1:20]; y = [42 45 47 49 52 59 66 74 85 98 ...其中:(x,y)为离散的数据点,spapi(3,x,y)表示用3阶B样条曲线对离散的数据点进行拟合,并且要经过给定的离散数据点,fnplt(sp)代表画出该B样条曲线。 ...
  • 机器人轨迹规划:三次样条曲线

    千次阅读 多人点赞 2020-05-05 22:47:25
    机器人轨迹规划:三次样条曲线 写在前面 在一些避障的应用场景下,一般都是先在任务空间中对多轴机械臂的末端进行路径规划,得到的是末端的运动路径点数据。这条轨迹只包含位置关系,并没有告诉机器人应该以怎样的...
  • 1符号和定义先讨论一元情形,给定区间[a,b]的一个分划,a=x00,x(xi,xi+k)=0,x[xi,xi+k],i=-k+1,…,n-1(iii)若xj+i=xi+jh,则Ni,k(x)=k(x-xih-k+12)其中k(x)=k+1j=0(-1)jCjk+1(x+k+12-j)k+/k!为以xj=j-k+12(j=0,1,…,k+1...
  • 三次均匀有理B样条插值曲线拟合原创-myselfB.m 三次均匀有理B样条插值拟合 通过四重节点办法算出控制点坐标,根据控制点拟合通过型值点的3次B样条曲线
  • 一维插值基于分段 g(x)=a+b*x+c*x^2+d*x^3 函数,其中节点保持两次连续可微。 这保证了插值是平滑的。 实现了不同的端结条件。 插值的深度是可变的,并且可以设置为取决于绝对或相对误差容限。 这意味着很容易插入...
  • 样条学习过程中遇到了积分求解样条长度的问题,一般曲线长度的求解可以采用对速度积分的方式,但如果直接由速度解析表达式计算路径长度非常困难,尤其当表达式复杂的时候,对于计算机编程而言非常不友好。...
  • Matlab样条工具箱(Spline ToolBox)与曲线拟合

    万次阅读 多人点赞 2009-12-05 00:03:00
    MATLAB 样条工具箱可以通过节点获得样本函数值,但不能根据x求y或z,也不能求得样本曲线方程。例如:ctrlpoints=[ 0 -1.2 -1.6 -1.4 -1 -0.5 -0.35 -0.6 -1.6 -0.2 -0.5 -1 -1.5 -2.2 -2.7 -3.2 -...
  • 样条插值的MATLAB实现

    2021-05-08 20:36:11
    第29卷第2期佳木斯大学学报(自然科学版)Vo.l29N o.2 2011年03月Journa l of Jia m usiUn i v ersity(N atural Sc i e nce Ed ition)M ar.2011文章编号:1008-1402(2011)02-0238-03样条插值的MATLAB实现1樊天锁,芮兵...
  • 三次参数样条曲线拟合,主要是为解决三次样条函数不能解决的问题而提出的。三次样条函数要求x满足单调递增,即x序列满足x0<x1<x2<...<xn。物理上的意义是,曲线不可以出现绕回或打圈。三次参数样条采用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,515
精华内容 606
关键字:

matlabb样条曲线

matlab 订阅