你好,欢迎访问远方教程PC版!
广告位招租
网站首页 >> 统计之窗 >> MATLAB专区 >> 文章内容

Matlab技巧24:MATLAB绘制B样条曲线详解(第2页)

[日期:2016-11-12]   来源:远方教程  作者:远方教程   阅读:12941次[字体: ] 访问[旧版]
 捐赠远方教程 

2 B样条结点矢量的确定

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

MATLAB绘制B样条曲线详解-远方教程

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

MATLAB绘制B样条曲线详解-远方教程

需要注意的是分段Bezier曲线必须满足n/k=正整数。

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

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

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

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

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