2 B样条结点矢量的确定
不同类型的B样条曲线区别主要在于节点矢量,对于具有 n+1 个控制顶点(P0, P1, ..., Pn) 的 k 次B样条曲线,无论是哪种类型都具有 n+k+2 个节点 ([u0,u1...un+k+1])。
根据图示,三种类型的B样条曲线对应的节点矢量分别为:
需要注意的是分段Bezier曲线必须满足n/k=正整数。
这里给出准均匀B样条和分段Bezier曲线的生成节点矢量的代码,均匀B样条的很简单就不列出了。假设共 n+1 个控制顶点,k 次B样条,输入参数为 n, k ,输出节点矢量NodeVector。
代码2:准均匀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
代码3:分段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