在做相关项目需要解决B样条插值问题,记录如下

感谢以下参考资料的帮助

% ref: 闭合 B 样条曲线控制点的快速求解算法及应用
% http://www.doc88.com/p-5714423317458.html
% https://blog.csdn.net/liumangmao1314/article/details/54588155

=============================

%计算B样条曲线控制点

function px = LU_B1(CPnum, V)   
    a = 1;
    b = 4;
    c = 1;
    d = 1;
    e = 1;
    
    f = zeros(CPnum-1,1);
    g = zeros(CPnum-2,1);
    h = zeros(CPnum,1);
    k = zeros(CPnum-1,1);

% get h[] & f[]
    h(1) = b;
    for i=1:CPnum-2
        f(i) = a/h(i);
        h(i+1) = b - f(i)*c;
    end

% get g[] & f[n-1]
    g(1) = d/h(1);
    for i=1:CPnum-3
        g(i+1) = -g(i)*c/h(i+1);
    end
    f(CPnum-1) = ( a-g(CPnum-2)*c )/h(CPnum-1);

% get k[] & h[n]
    k(1) = e;
    for i=1:CPnum-3
        k(i+1) = -f(i)*k(i);
    end
    k(CPnum-1) = c - f(CPnum-2)*k(CPnum-2);

gksum = 0;
    for i=1:CPnum-2
        gksum = gksum + g(i)*k(i);
    end
    h(CPnum) = b - gksum - f(CPnum-1)*c;

% 矩阵求解过程,追的过程
    x = zeros(CPnum,1);   
    x(1) = 6*V(end);
    
    for i=1:CPnum-2      
        x(i+1) = 6*V(i) - f(i)*x(i);       
    end

gxsum = 0;

for i=1:CPnum-2
        gxsum = gxsum + g(i)*x(i);        
    end
    
    x(CPnum) = 6*V(CPnum-1) - gxsum - f(CPnum-1)*x(CPnum-1);    
    
    % 赶的过程
    px = zeros(CPnum+2,1);    
    
    px(CPnum) = x(CPnum)/h(CPnum);
    px(CPnum-1) = ( x(CPnum-1)-k(CPnum-1)*px(CPnum) )/h(CPnum-1);
    
    for i=CPnum-2:-1:1
        px(i) = ( x(i)-c*px(i+1)-k(i)*px(CPnum) )/h(i);
    end
    px(CPnum+1) = px(1);
    px(CPnum+2) = px(2);    
end


% 插值计算三次周期性b样条曲线
function p = Cubic_Bsp(u,x)
    b(1) = ((1-u)^3)/6;
    b(2) = (3*u^3-6*u^2+4)/6;
    b(3) = (-3*u^3+3*u^2+3*u+1)/6;
    b(4) = (u^3)/6;

p = x*b';
end


%test.m 测试

clear;clc
x = [-1;-1;1;1;0.2];
y = [1;-0.5;-1;1;0.8];
z = zeros(6,1);
z(3) = 1;

CPnum = size(x,1);

%x,y,z坐标分别计算B样条曲线控制点

px = LU_B1(CPnum, x);
py = LU_B1(CPnum, y);
pz = LU_B1(CPnum, z);

%首尾相连,曲线闭合

x(CPnum+1) = x(1);
y(CPnum+1) = y(1);
z(CPnum+1) = z(1);

figure;
plot3(x,y,z,'ro-');
hold on;
for i=1:CPnum%用这个循环
    c=num2str(i);
    c=[' ',c];
    text(x(i),y(i),z(i),c)
    %text(x(i),y(i),c)
end

plot3(px,py,pz,'g-');
for i=1:CPnum+1%用这个循环
    c=num2str(i);
    c=[' ',c];
    text(px(i),py(i),pz(i),c)
    plot3(px(i),py(i),pz(i),'*');
end

axis equal

px(CPnum+3) = px(3);
py(CPnum+3) = py(3);
pz(CPnum+3) = pz(3);

px(CPnum+4) = px(4);
py(CPnum+4) = py(4);
pz(CPnum+4) = pz(4);

%两点之间对10个点进行插值计算

nP = 10;
delta = 1.0/nP;
for j=1:CPnum
    u = 0.0;
    for i=1:nP
        
        p = px';
        Xi = p(j:j+3);
        xx(i+(j-1)*nP) = Cubic_Bsp(u,Xi);  
        p = py';
        Yi = p(j:j+3);
        yy(i+(j-1)*nP) = Cubic_Bsp(u,Yi);        
        
        p = pz';
        Zi = p(j:j+3);
        zz(i+(j-1)*nP) = Cubic_Bsp(u,Zi);        
        
        u = u + delta;
    end
end
xx(end+1) = x(1);
yy(end+1) = y(1);
zz(end+1) = z(1);
plot3(xx,yy,zz,'b--')

结果如图所示,红色为三维空间5个不共面点

绿色为B样条曲线控制点

蓝色为B样条拟合曲线

三维闭合B样条曲线拟合算法Matlab代码相关推荐

  1. dst matlab,DSTcode DST跟踪算法MATLAB代码,复杂环境中仿多目标 实现的单 Other systems 其他 272万源代码下载- www.pudn.com...

    文件名称: DSTcode下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 82 KB 上传时间: 2017-03-17 下载次数: 0 提 供 者: Mar ...

  2. dijkstra算法matlab代码_头脑风暴优化(BSO)算法(附MATLAB代码)

    BSO讲解https://www.zhihu.com/video/1252605855767736320 B站搜索:随心390,同步观看视频 各位小伙伴可在闲鱼搜索 优化算法交流地,即可搜索到官方闲鱼 ...

  3. AHP算法MATLAB代码

    AHP算法MATLAB代码 使用方法(详情请看这个视频的2P) 数学建模算法之层次分析法详解 代码如下 (1)构造判断矩阵A (2)将下文代码复制粘贴到Matlab中即可 例如: A=[1 3 5;0 ...

  4. 【物理应用】内联全息图外推算法matlab代码

    1 简介 内联全息图外推算法matlab代码 2 部分代码 ​close allclear all% addpath('C:/Program Files/MATLAB/R2010b/myfiles') ...

  5. matlab中gad,10大经典算法matlab代码以及代码详解【数学建模、信号处理】

    [实例简介] 10大算法程序以及详细解释,包括模拟退火,禁忌搜索,遗传算法,神经网络.搜索算法. 图论. 遗传退火法.组合算法.免疫算法. 蒙特卡洛.灰色预测.动态规划等常用经典算法.是数学建模.信号 ...

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

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

  7. a*算法matlab代码_NSGAII多目标优化算法讲解(附MATLAB代码)

    小编今天为大家讲解NSGA-II多目标优化算法,提到多目标优化,大家可能第一个就想到NSGA-II算法,今天小编就带领大家解开NSGA-II的神秘面纱. NSGA-II全称是快速非支配排序遗传算法,这 ...

  8. a*算法matlab代码_10分钟带你入门MATLAB

    ​ 10分钟带你快速入门MATLABhttps://www.zhihu.com/video/1234089282815188992 前一段时间我发现有些小伙伴MATLAB基础比较薄弱,今天我来让各位小 ...

  9. 粒子群算法matlab代码实例使用与参数解读(二维数据)

    粒子群算法与matlab代码实例使用 粒子群算法介绍 粒子群算法使用场景 粒子群的优缺点 实例编程分析 代码分析 参数分析 更多应用场景 在网络中有很多的博客都已经粒子群算法的算法本质讲解的非常清晰明 ...

  10. 多目标优化算法matlab代码大合集

    [NSGA2]基于NSGA2算法求解多目标优化问题Matlab源码2 [水母搜索优化器算法]基于水母搜索优化器算法求解多目标优化问题(JellyfishSearchOptimizer,JSO)[粒子群 ...

最新文章

  1. hive sql 学习笔记
  2. mysql老是自动停止_ecs云服务器 mysql经常自动停止挂掉重启问题分析
  3. 无符号有符号乘法_【编译笔记】变量除以常量的优化(一)——无符号除法
  4. (学习)linux驱动学习知识积累(一)
  5. 软件测试的基础知识(六)
  6. [CF1110E]Magic Stones
  7. Java商城系统后端和小程序模板、毕业设计下载
  8. 数学中常见的曲面方程及形状
  9. 澳洲计算机科学专业,盘点澳洲八大名校那些最强的专业—计算机科学专业
  10. 杨柳目-杨柳科-杨属-杨树:杨树
  11. 生产计划排产软件三大操作流程
  12. 项目环境搭建,数据库,以及Swagger2介绍(二)
  13. 【C++】1023 组个最小数
  14. Enet语义分割笔记
  15. 电脑散热测试软件,不服跑个分?小编热荐7个PC测试软件
  16. 虚幻竞技场中的控制台命令
  17. 西门子plc s-7 1200驱动伺服电机方法
  18. 苹果远程服务器未响应,win10 远程服务器未响应
  19. 能力整合、品牌升级,一大朵紫光云正在到达战场
  20. 计算机网络云南大学实验四,云南大学软件学院计算机网络原理实验四.doc

热门文章

  1. i386和i686的区别
  2. LintCode 快速幂
  3. app软件怎么开发 盘点3种app制作方式
  4. 在防火墙中安装ASDM
  5. h2ouve下载 insyde_神舟tx6zx6gx9tx9蓝天模具解锁bios高级菜单
  6. MDK5软件入门之新建工程项目模板
  7. 曼昆《经济学原理》-微观经济学-随记(二)
  8. php goeasy,PHP使用GOEASY实现WEB实时推送
  9. goeasy连接初始化,vue
  10. 海康、大华摄像头chrome高版本实时播放(java集成)