精华内容
下载资源
问答
  • 三次B样条曲线拟合算法

    万次阅读 多人点赞 2017-01-17 22:10:28
    三次B样条曲线方程B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程。这里会一次介绍两种拟合算法。...

    1 三次B样条曲线方程

    B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程。这里会一次介绍两种拟合算法。首先介绍B样条的曲线方程。
    B样条曲线的总方程为:P(t)=∑i=0nPiFi,k(t)P(t)=\sum_{i=0}^{n} P_{i}F_{i,k}(t)P(t)=i=0nPiFi,k(t) (1)
    其中PiP_iPi是控制曲线的特征点,Fi,k(u)F_{i,k}(u)Fi,k(u)则是K阶B样条基函数。
    1.1 三次B样条曲线方程中基函数为:
    Fi,k(t)=1k!∑m=0k−i(−1)m(mk+1)(t+k−m−j)kF_{i,k}(t)=\frac{1}{k!}\sum_{m=0}^{k-i}(-1)^{m}\binom{m}{k+1}(t+k-m-j)^kFi,k(t)=k!1m=0ki(1)m(k+1m)(t+kmj)k (2)
    其中(mk+1)\binom{m}{k+1}(k+1m)表示阶乘,化成看的明白的式子就是:

    这里写图片描述
    将图片上的基函数代入到方程(1)中,就是:
    P(t)=P0∗F0,3(t)+P1∗F1,3(t)+P2∗F2,3(t)+P3∗F3,3(t)P(t)= P_0*F_{0,3}(t)+P_1*F_{1,3}(t)+P_2*F_{2,3}(t)+P_3*F_{3,3}(t)P(t)=P0F0,3(t)+P1F1,3(t)+P2F2,3(t)+P3F3,3(t) (3)
    方程(3)就是三次B样条曲线方程。


    2019-04-18 更新

    有小伙伴提到上式(2)的j是什么意思,其实j就是控制点的索引值。这里我把书上的公式摘抄下来,可能看起来更为清晰。
    参考书籍:《计算机图形学 第3版》何援军 第13章
    三次B样条曲线计算
    F0,3(t)=13!∑j=03(−1)jC4j)(t+3−0−j)3F_{0,3}(t)=\frac{1}{3!}\sum_{j=0}^{3}(-1)^{j}C^{j}_{4})(t+3-0-j)^3F0,3(t)=3!1j=03(1)jC4j)(t+30j)3

    =16[(−1)0C40(t+3)3+(−1)1C41(t+2)3+(−1)2C42(t+1)3+(−1)3C43t3]=\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+3)^{3}+(-1)^{1}C^{1}_{4}(t+2)^{3}+(-1)^{2} C^{2}_{4}(t+1)^{3}+(-1)^{3}C^{3}_{4}t^{3}]=61[(1)0C40(t+3)3+(1)1C41(t+2)3+(1)2C42(t+1)3+(1)3C43t3]

    =16(−t3+3t2−3t+1)=16(1−t)3=\frac{1}{6}(-t^{3}+3t^{2}-3t+1)=\frac{1}{6}(1-t)^{3}=61(t3+3t23t+1)=61(1t)3

    F1,3(t)=13!∑j=02(−1)jC4j)(t+3−1−j)3F_{1,3}(t)=\frac{1}{3!}\sum_{j=0}^{2}(-1)^{j}C^{j}_{4})(t+3-1-j)^3F1,3(t)=3!1j=02(1)jC4j)(t+31j)3

    =16[(−1)0C40(t+2)3+(−1)1C41(t+1)3+(−1)2C42t3]=\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+2)^{3}+(-1)^{1}C^{1}_{4}(t+1)^{3}+(-1)^{2} C^{2}_{4}t^{3}]=61[(1)0C40(t+2)3+(1)1C41(t+1)3+(1)2C42t3]

    =16(3t3−6t2+4)=\frac{1}{6}(3t^{3}-6t^{2}+4)=61(3t36t2+4)

    F2,3(t)=13!∑j=01(−1)jC4j)(t+3−2−j)3F_{2,3}(t)=\frac{1}{3!}\sum_{j=0}^{1}(-1)^{j}C^{j}_{4})(t+3-2-j)^3F2,3(t)=3!1j=01(1)jC4j)(t+32j)3

    =16[(−1)0C40(t+1)3+(−1)1C41t3=\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+1)^{3}+(-1)^{1}C^{1}_{4}t^{3}=61[(1)0C40(t+1)3+(1)1C41t3

    =16(−3t3+3t2+3t+1)=\frac{1}{6}(-3t^{3}+3t^{2}+3t+1)=61(3t3+3t2+3t+1)

    F3,3(t)=13!∑j=00(−1)jC4j)(t+3−3−j)3F_{3,3}(t)=\frac{1}{3!}\sum_{j=0}^{0}(-1)^{j}C^{j}_{4})(t+3-3-j)^3F3,3(t)=3!1j=00(1)jC4j)(t+33j)3

    =16[(−1)0C40t3=\frac{1}{6}[(-1)^{0}C^{0}_{4}t^{3}=61[(1)0C40t3

    =16t3=\frac{1}{6}t^{3}=61t3


    2 三次B样条曲线近似拟合

    近似拟合很简单。不需要求控制点,求得Fi,k(t)F_{i,k}(t)Fi,k(t),由上述方程(3),代入P0,P1,P2,P3P_0,P_1,P_2,P_3P0,P1,P2,P3就可以得到由这四个点近似拟合的一段三次B样条曲线,起始点在P0P_0P0,终点在P1P_1P1,对于闭合轮廓,最后一段可以取前两点做辅助,拟合实验结果我最后一块给出。这种近似拟合曲线光滑,但是最大不足就是不过特征点,也就是不过PiP_iPi,需要过点需要反求控制点再拟合。

    3 三次B样条插值拟合

    插值拟合较为复杂。其实也不算是很复杂,找资料过程和理解过程是一个复杂的过程。不过有了前面大神做工作,我们只是借用别人的成果写代码就好了。我给大家看一篇论文,大家可以百度或者去知网搜索,闭合 B 样条曲线控制点的快速求解算法及应用。文章讲解了反求控制点的具体步骤,写的非常详细,基本上贴近代码的那种。大家可以根据这篇论文反求控制点,拟合出来的三次B样条曲线是经过PiP_iPi的。代码就不放了,很多,可以根据我给的那篇论文直接编写相应代码,有问题可以私信我,知无不言。
    ##4 拟合结果
    这里写图片描述 原轮廓
    这里写图片描述 近似拟合轮廓。可以看到没过黑色特征点,只是近似拟合
    这里写图片描述 插值拟。可以看到曲线经过黑色特征点,不过有一些不足之处。

    ##5 总结
    三次B样条曲线拟合轮廓效果还是可以,较之Beizer(可以参考我博客三次Beizer曲线拟合算法),B样条将一些细节描述的很好,很多细节之处都贴近原轮廓,但是有一些不足之处,可以看到对直线拟合效果不是很好。两篇博客都是关于闭合轮廓的拟合,对于非闭合或者只是一段曲线拟合,还有一种曲线是很好的,《数值分析》提到过,叫三次样条插值拟合,拟合效果很好,我做过拟合一元三次方程曲线,拟合效果跟原曲线非常贴近,不过过程中需要用到追赶法,而追赶法需要满足一个条件,对于闭合曲线三次样条插值是不满足这个条件的,所以我没去深研究,大家可以去试一试。谢谢大家!

    -------------------------------------------------2018-10-30--------------------------------------------
    真的很感谢大家的支持,这一年都比较忙,找实习and找工作,而且这个东西是研一上学期搞的,现在看都毫无印象,对自己说一句:牛逼。我把代码放在网盘了(能运行,但现在没效果,大家可以检查下,之前是OK的),本来想上传到CSDN,好像要C币,而且要审核,太墨迹了。
    链接: https://pan.baidu.com/s/1mSQMmvL71gwEAqgiT6O9Gg 提取码: xv5f

    展开全文
  • 三次B样条曲线

    2016-12-01 15:53:37
    在屏幕上使用鼠标左键绘制数量大于4的任意顶点形成控制多边形,鼠标右键绘制三次B样条曲线,同时在控制多边形的每一个三角形内用虚线表示三次B样条曲线的几何生产原理 编译器VC2010
  • 三次B样条插补

    2018-03-10 19:59:02
    文件为三次B样条插补基函数,根据齐次坐标方法可画NURBS曲线,齐次坐标法为另一个资源,请分别下载
  • 三次B样条拟合

    2016-12-12 16:53:16
    可以拟合经过过形值点的三次B样条曲线
  • 三次B样条曲线算法 计算机图形学 MFC 孔令德 代码 课件案例 习题答案 第七章 三次B样条曲线算法 计算机图形学 MFC 孔令德 代码 课件案例 习题答案 第七章
  • 在OpenGL的基础上进行编写,绘制三次B样条曲线,可以通过鼠标设置控制点位置、拖动控制点观察曲线动态变化
  • 简单详细的均匀三次B样条曲线插值MATLAB代码,有注释
  • 用于路径规划算法,A*源代码,三次B样条源代码 用于路径规划算法,A*源代码,三次B样条源代码 用于路径规划算法,A*源代码,三次B样条源代码
  • 非均匀三次B样条曲线插值的Jacobi-PIA算法
  • 基于三次B样条逆向细分的自由曲线的多分辨率表示
  • 三次b样条画图程序

    2014-03-03 18:49:20
    matlab编写的三次b样条绘图程序,对于初学者来讲是一难得的入门程序。通过该程序,初始研究样条曲线的新手,可以体会节点、控制点及次数是怎样来改变曲线形状的。
  • 三次B样条 matlab

    2010-07-14 15:11:50
    可以自己根据现场的数据进行随意的改动数值,从而绘画出三次B样条曲线!
  • 基于三次B样条多尺度边缘检测,检测效果明显优于canny算子。
  • 三次B样条曲线骨架卷积曲面造型,张海林,金小刚,卷积曲面在树、海生物等复杂光滑物体的造型中具有重要的应用价值。本文提出了一种基于B样条曲线降阶的三次B样条曲线骨架卷积曲面�
  • 三次b样条插值函数

    千次阅读 2019-05-07 10:55:34
    三次b样条插值函数是 spline = spapi(knots,x,y) spapi(k,x,y) spapi({knork1,…,knorkm},{x1,…,xm},y) spapi(…,‘noderiv’) % B样条曲线生成程序 % 说明:给定8个控制顶点{(3 5),(2 4),(3 2),(6 1),(5 8),(10 6)...

    原文地址:用matlab实现B样条曲线作者:云梦之殇

    三次b样条插值函数是

    spline = spapi(knots,x,y)
    spapi(k,x,y)
    spapi({knork1,…,knorkm},{x1,…,xm},y)
    spapi(…,‘noderiv’)

    % B样条曲线生成程序
    % 说明:给定8个控制顶点{(3 5),(2 4),(3 2),(6 1),(5 8),(10 6),(8 1),(6 0)}
    %load c;x=800:25:1800;
    %a(1,:)=x;a(2,:)=c;
    a=[10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90;
    20 16 26 26 26 26 24 24 24 22 22 16 28 26 26 26 24]; % 控制顶点数组;
    %a=[4 3 2 3 6 5 10 8 6 4;6 5 4 2 1 8 6 1 0 -1];%增加两个控制顶点(4 6)(4 -1)从而使曲线通过原来的首末点;
    plot(a(1,:),a(2,:),’:’); % 绘制控制多边形;
    hold on; % 默认为hold off,此命令用来保留控制多边形的图形;
    for i=1:38; % 由于4个顶点可以确定一条B样条,共有8个控制顶点,可确定5条B样条曲线;
    %for i=1:7;
    for u=0:0.001:1; % 参数u;

    b0=1.0./6.(1-u).^3; % 基函数b0;
    b1=1.0./6.
    (3.u.3-6.*u.2+4); % 基函数b1;
    b2=1.0./6.
    (-3.*u.3+3.*u.2+3.*u+1); % 基函数b2;
    b3=1.0./6.*u.^3; % 基函数b3;

    x=b0.*a(1,i)+b1.*a(1,i+1)+b2.*a(1,i+2)+b3.*a(1,i+3); % 确定曲线的横坐标x;
    y=b0.*a(2,i)+b1.*a(2,i+1)+b2.*a(2,i+2)+b3.*a(2,i+3); % 确定曲线的纵坐标y;

    line(x,y); % 绘制曲线坐标点;
    end
    end
    hold off;
    转自:http://hi.baidu.com/liyaosong707/blog/item/a248da24183fcf34c99559ff.html

    %==均匀三次B样条曲线插值=
    %
    %see also http://www.matlabsky.com
    %
    %定义变量:
    %X:原始资料,d:控制顶点
    %n:数据条数,k:B样条的次数
    %
    X=load(‘data.txt’);
    n=length(X); %得数据维数;
    %A:方程系数-----------------------------
    A=zeros(n+2);
    A(1,1)=1;A(1,2)=-2;A(1,3)=1;
    A(n+2,n)=1;A(n+2,n+1)=-2;A(n+2,n+2)=1;
    for i=2:(n+1)
    A(i,i-1)=1;
    A(i,i)=4;
    A(i,i+1)=1;
    end
    %e:方程右边.得到的控制点首尾与插值数据相同.且与控制首末连线相切
    e=[0,0];
    e(n+2,:)=[0,0];
    转自:http://www.matlabsky.com/thread-669-1-1.html

    Matlab样条工具箱(Spline ToolBox)与曲线拟合

    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 2 3 4 5 6 6 6 6];

    x0=ctrlpoints(1,:);

    y0=ctrlpoints(2,:);

    plot(x0,y0,‘ro’);%画所有控制点

    hold on;
    sp = spmak(knots,ctrlpoints);%生成B样条函数
    fnplt(sp,[knots(1),knots(13)]);%根据所有节点,画样条曲线图
    %fnplt(sp,‘b*’);
    %hold on;

    dt=knots(1):1:knots(13);
    p = fnval(sp,dt);%计算在给定点处的样条函数值
    plot(p(1,:),p(2,:),’*g’);

    dp1 = fnder(sp);%求样条函数的微分(即求导数)
    dp = fnval(dp1,dt);
    len = size(dt,2);
    for i = 1:len
    dir = dp(:,i);
    scale = 1/sqrt(dir(1)2+dir(2)2);
    dir = dir*scale;
    plot([p(1,i),p(1,i)+dir(2)],[p(2,i),p(2,i)-dir(1)],‘r’);
    end

    axis equal


    另外:
    Matlab 样条工具箱(Spline ToolBox)

    Matlab样条工具箱中的函数提供了样条的建立,操作,绘制等功能;
    一. 样条函数的建立
    第一步是建立一个样条函数,曲线或者曲面。这里的样条函数,根据前缀,分为4类:
    cs* 三次样条
    pp* 分段多项式样条,系数为t^n的系数
    sp* B样条, 系数为基函数B_n^i(t)的系数
    rp* 有理B样条

    二. 样条操作
    样条操作包括:函数操作:求值,算术运算,求导求积分等等
    节点操作:主要是节点重数的调节,设定,修改等等

    三. 简单示例
    % step1: load ctrlpoints and knots
    load data_example

    % step 2: create the spline
    sp = spmak(knots,ctrlpoints’);
    fnplt(sp,[knots(5),knots(42)]);

    % step 3: get points on the curve
    dt = knots(5):3:knots(42);
    p = fnval(sp,dt);
    plot(p(1,:),p(2,:),’.g’)

    % step 4: get dir draw normals
    dp1 = fnder(sp);
    dp = fnval(dp1,dt);
    len = size(dt,2);
    for i = 1:len
    dir = dp(:,i);
    scale = 1/sqrt(dir(1)2+dir(2)2);
    dir = dir*scale;
    plot([p(1,i),p(1,i)+dir(2)],[p(2,i),p(2,i)-dir(1)],‘r’);
    end

    附:样条工具箱函数

    1. 三次样条函数
      csapi 插值生成三次样条函数
      csape 生成给定约束条件下的三次样条函数
      csaps 平滑生成三次样条函数
      cscvn 生成一条内插参数的三次样条曲线
      getcurve 动态生成三次样条曲线

    2. 分段多项式样条函数
      ppmak 生成分段多项式样条函数
      ppual 计算在给定点处的分段多项式样条函数值

    3. B样条函数
      spmak 生成B样条函数
      spcrv 生成均匀划分的B样条函数
      spapi 插值生成B样条函数
      spap2 用最小二乘法拟合生成B样条函数
      spaps 对生成的B样条曲线进行光滑处理
      spcol 生成B样条函数的配置矩阵

    4. 有理样条函数
      rpmak 生成有理样条函数
      rsmak 生成有理样条函数

    5. 样条操作函数
      fnval 计算在给定点处的样条函数值
      fmbrk 返回样条函数的某一部分(如断点或系数等)
      fncmb 对样条函数进行算术运算
      fn2fm 把一种形式的样条函数转化成另一种形式的样条函数
      fnder 求样条函数的微分(即求导数)
      fndir 求样条函数的方向导数
      fnint 求样条函数的积分
      fnjmp 在间断点处求函数值
      fnplt 画样条曲线图
      fnrfn 在样条曲线中插入断点。
      fntlr 生成tarylor系数或taylor多项式

    6. 样条曲线端点和节点处理函数
      augknt 在已知节点数组中添加一个或多个节点
      aveknt 求出节点数组元素的平均值
      brk2knt 增加节点数组中节点的重次
      knt2brk 从节点数组中求得节点及其重次
      knt2mlt 从节点数组中求得节点及其重次
      sorted 求出节点数组的元素在另一节点数组中属于第几个分量
      aptknt 求出用于生成样条曲线的节点数组
      newknt 对分段多项式样条函数进行重分布
      optknt 求出用于内插的最优节点数组
      chbpnt 求出用于生成样条曲线的合适节点数组
      转自:http://blog.csdn.net/wuzoujing/article/details/4943251

    基于Matlab的双三次有理B样条曲面

    xc=[1,1,2,1;4,4,4,4;7,6,7,8;10,9,10,9;];
    yc=[1,3,6,9;0,3,6,10;0,3,6,9;1,4,7,10;];
    zc=[3,5,5,2;4,6,7,4;4,7,6,5;2,4,5,4];%给出控制点坐标

    %下面计算基函数
    i=0; %i表示点的标号
    for u=0:0.01:1
    for v=0:0.01:1
    i=i+1;
    a1=1/6*(1-3u+3u.u-u.u.u);
    a2=1/6
    (4-6
    u.u+3u.u.u);
    a3=1/6
    (1+3
    u+3
    u.u-3u.u.u);
    a4=1/6
    u.u.u;
    b1=1/6
    (1-3
    v+3
    v.v-v.v.v);
    b2=1/6
    (4-6
    v.v+3v.v.v);
    b3=1/6
    (1+3
    v+3
    v.v-3v.*v.v);
    b4=1/6
    v.*v.*v;

    xq(i)=[a1 a2 a3 a4]xc[b1;b2;b3;b4];%曲面上点的坐标赋值
    yq(i)=[a1 a2 a3 a4]yc[b1;b2;b3;b4];
    zq(i)=[a1 a2 a3 a4]zc[b1;b2;b3;b4];
    end
    end

    mesh(xc,yc,zc);%控制点的网格
    hidden;
    hold on;
    plot3(xq,yq,zq);%生成曲面

    [转载]用matlab实现B样条曲线

    b1=[2,2];b2=[3,5];b3=[5,6];b4=[7,3];%四个型值点的横纵坐标值 可以自定
    plot([b1(1),b2(1),b3(1),b4(1)],[b1(2),b2(2),b3(2),b4(2)],‘o’);%画出型值点
    hold on;
    N=[5 1 0 0;1 4 1 0;0 1 4 1;0 0 1 5];
    P=N(6*([b1;b2;b3;b4]));%P是二维数组 存放控制点 求出P

    xc1=P(1); %对应6个控制点
    xc2=P(2);
    xc3=P(3);
    xc4=P(4);
    yc1=P(5);
    yc2=P(6);
    yc3=P(7);
    yc4=P(8);

    plot([xc1,xc2,xc3,xc4],[yc1,yc2,yc3,yc4],’’)%画出控制点
    hold on;
    plot([xc1,xc2,xc3,xc4],[yc1,yc2,yc3,yc4])%连接控制点
    hold on;
    u=0:0.01:1;
    N1=1/6
    (1-3u+3u.u-u.u.u);%基函数
    N2=1/6
    (4-6
    u.u+3u.u.u);
    N3=1/6
    (1+3
    u+3
    u.u-3u.*u.u);
    N4=1/6
    u.*u.*u;
    xp=xc1.*N1+xc1.*N2+xc2.*N3+xc3.*N4;
    yp=yc1.*N1+yc1.*N2+yc2.*N3+yc3.*N4;
    plot(xp,yp);%正算第一段B样条
    hold on;
    xp=xc1.*N1+xc2.*N2+xc3.*N3+xc4.*N4;
    yp=yc1.*N1+yc2.*N2+yc3.*N3+yc4.*N4;
    plot(xp,yp);%正算第二段B样条
    hold on;
    xp=xc2.*N1+xc3.*N2+xc4.*N3+xc4.*N4;
    yp=yc2.*N1+yc3.*N2+yc4.*N3+yc4.*N4;
    plot(xp,yp);%正算第三段B样条
    hold on;

    http://hi.baidu.com/aillieo/blog/item/e001793ff61172e154e72349.html

    展开全文
  • 基于三次B样条函数多尺度边缘检测,用三次B样条进行多尺度的平滑,三次分解和重构图像,效果优于其他边缘检测算法,亲测可用
  • 三次B样条matlib程序

    2010-01-28 17:46:24
    三次B样条应用很广泛,本人写了一个三次B样条matlib程序来学习,希望在学习该内容的人有所帮助。
  • 三次B样条曲线拟合C++

    千次阅读 2020-08-21 11:20:17
    三次B样条曲线拟合C++ B样条曲线的方程:P=∑i=0nPiFi,k(t)\sum_{i=0}^nP_iF_{i,k}(t)∑i=0n​Pi​Fi,k​(t) 其中Fi,k(t)F_{i,k}(t)Fi,k​(t)为基函数,三次B样条的基函数为: F0,3(t)=16(1−t)3F_{0,3}(t)=\...

    B样条曲线的方程:P=i=0nPiFi,k(t)\sum_{i=0}^nP_iF_{i,k}(t)
    其中Fi,k(t)F_{i,k}(t)为基函数,三次B样条的基函数为:
    F0,3(t)=16(1t)3F_{0,3}(t)=\displaystyle{\frac{1}{6}{(1-t)}^3}

    F1,3(t)=16(3t36t2+4)F_{1,3}(t)=\displaystyle{\frac{1}{6}(3t^3-6t^2+4)}

    F2,3(t)=16(3t3+3t2+3t+1)F_{2,3}(t)=\displaystyle{\frac{1}{6}(-3t^3+3t^2+3t+1)}

    F3,3(t)=16t3F_{3,3}(t)=\displaystyle{\frac{1}{6}t^3}

    所以,三次B样条的方程式为:
    P=P0F0,3(t)+P1F1,3(t)+P2F2,3(t)+P3F3,3(t)P=P_0F_{0,3}(t)+P_1F_{1,3}(t)+P_2F_{2,3}(t)+P_3F_{3,3}(t)
    把基函数代入可以简化为:
    P=w0+w1t+w2t2+w3t3P=w_0+w_1t+w_2t^2+w_3t^3 (0≤t<≤1)
    其中,w0=16(P0+4P1+P2)w_0=\displaystyle{\frac{1}{6}(P_0+4P_1+P_2)}

    w1=12(P0P2)w_1=\displaystyle{-\frac{1}{2}(P_0-P_2)}

    w2=12(P02P1+P2)w_2=\displaystyle{\frac{1}{2}(P_0-2P_1+P_2)}

    w3=16(P03P1+3P2P3)w_3=\displaystyle{-\frac{1}{6}(P_0-3P_1+3P_2-P_3)}

    因此,每四个离散点就可拟合一段曲线,比如P0,P1,P2,P3P_0,P_1,P_2,P_3可以拟合一段光滑曲线,P1,P2,P3,P4P_1,P_2,P_3,P_4可以拟合下一段,相邻两段曲线是平滑过渡的,以此类推N个点可以拟合出N-3段平滑相接的曲线。
    在这里插入图片描述以上是非闭合曲线的拟合,闭合曲线只需离散点集首尾相连,也就是说,还需用PN1,P0,P1,P2P_{N-1},P_0,P_1,P_2拟合一段曲线。
    c++代码如下:

    /*B样条曲线拟合
    @return 返回拟合得到的曲线
    @discretePoints 输入的离散点,至少4个点
    @closed 是否拟合闭合曲线,true表示闭合,false不闭合
    @stride 拟合精度
    */
    vector<Point2f> BSplineFit(vector<Point2f> discretePoints, bool closed, double stride = 0.01) {
    	vector<Point2f> fittingPoints;
    	for (int i = 0; i < (closed ? discretePoints.size() : discretePoints.size() - 1); i++) {
    		Point2f xy[4];
    		xy[0] = (discretePoints[i] + 4 * discretePoints[(i + 1) % discretePoints.size()] + discretePoints[(i + 2) % discretePoints.size()]) / 6;
    		xy[1] = -(discretePoints[i] - discretePoints[(i + 2) % discretePoints.size()]) / 2;
    		xy[2] = (discretePoints[i] - 2 * discretePoints[(i + 1) % discretePoints.size()] + discretePoints[(i + 2) % discretePoints.size()]) / 2;
    		xy[3] = -(discretePoints[i] - 3 * discretePoints[(i + 1) % discretePoints.size()] + 3 * discretePoints[(i + 2) % discretePoints.size()] - discretePoints[(i + 3) % discretePoints.size()]) / 6;
    		for (double t = 0; t <= 1; t += stride) {
    			Point2f totalPoints = Point2f(0, 0);
    			for (int j = 0; j < 4; j++) {
    				totalPoints += xy[j] * pow(t, j);
    			}
    			fittingPoints.push_back(totalPoints);
    		}
    	}
    	return fittingPoints;
    }
    

    非闭合拟合效果:

    在这里插入图片描述
    闭合曲线拟合效果:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 读取带障碍环境的地图,二值化处理,使用rrt算法得到路径规划图,使用去除冗余点的方法对路径进行优化,再用三次B样条对路径进行平滑处理
  • 绘制三次B样条

    2016-11-29 19:59:51
    生成经过首尾节点的三次均匀B样条曲线,代码简单,适合初学者
  • 计算机图形学课程设计题目,使用鼠标边点击边边生成曲线,而且还能实现实现绘制出三次B样条的的切线。
  • 使用散乱点集重建曲线曲面,在逆向工程和计算机视觉中有着广泛的应用。提出基于SOM网络的三次B样条曲线...用特征点反求三次B样条曲线控制点,利用控制点重建三次B样条曲线。试验结果表明,算法取得的曲线重建效果良好。
  • 基于PMAC三次B样条插补的曲线高速数控加工,秦明明,李国龙,采用PC+NC结构,建立了一种基于PMAC的曲线高速数控加工控制系统。在AutoCAD中进行曲线轮廓设计,并通过对AutoCAD进行二次开发的方法来搭�
  • 解压密码为:hur.cn 主要采用C++编程实现,过控制点的三次B样条曲线拟合,可以用于各种高级的曲线拟合方面。
  • 代码是基于C++的三次B样条曲线拟合代码,包含插值拟合,近似拟合就不放代码了,较简单,我的博客中有相关论文链接。http://blog.csdn.net/liumangmao1314/article/details/54588155
  • 三次B样条反算的一种简便算法 提出一种反算三次 B 样条曲线、 曲面控制顶点的简便算法.该算法适用于准均匀和非均匀 B 样条曲线、 曲面的反算.算法采用非节点边界条件, 不需要由用户提供, 从而使反算过程得以简化

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 401
精华内容 160
关键字:

三次b样条