matlab绘制均匀b样条曲线,MATLAB绘制B样条曲线

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

B样条曲线的绘制函数: % DrawSpline.m文件function DrawSpline(n, k, P, NodeVector)% B样条的绘图函数% 已知n+1个控制顶点P(i), k次B样条,P是2*(n+1)矩阵存控制顶点坐标, 节点向量NodeVectorplot(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); endend

调用 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

三种类型的B样条曲线:

1. 均匀B样条曲线

2. 准均匀B样条曲线

3. 分段Bezier曲线

参考文献:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值