查看: 472|回复: 0|关注: 0

[未答复] 悬赏100元寻MATLAB高手修改“3次均匀B样条程序”

[复制链接]

新手

7 麦片

财富积分


050


2

主题

4

帖子

0

最佳答案
发表于 2019-2-11 16:27:46 | 显示全部楼层 |阅读模式
本人写了一个“3次均匀B样条插值”的程序。我写这个程序的思路如下:
(1)首先写了一个由“控制顶点”生成“3次均匀B样条”的程序,代码和运行结果如下:
  1. %%%%%%%%%%%%%由控制顶点生成3次均匀B样条%%%%%%%%%%%%%
  2. a=[10 20 30 40 50 60;20 40 40 20 20 40];% 控制顶点坐标矩阵;
  3. b=[];
  4. c=[];
  5. plot(a(1,:),a(2,:),':'); % 绘制控制多边形;
  6. hold on; % 默认为hold off,此命令用来保留控制多边形的图形;
  7. N= size(a,2)-3;
  8. for i=1:N ; % for i=1:N,N由a的列数减去3 ;
  9. for u=0:0.001:1;% 参数u;
  10. b0=1.0./6.*(1-u).^3; % 基函数b0;
  11. b1=1.0./6.*(3.*u.^3-6.*u.^2+4); % 基函数b1;
  12. b2=1.0./6.*(-3.*u.^3+3.*u.^2+3.*u+1); % 基函数b2;
  13. b3=1.0./6.*u.^3; % 基函数b3;
  14. x=b0.*a(1,i)+b1.*a(1,i+1)+b2.*a(1,i+2)+b3.*a(1,i+3); % 确定曲线的横坐标x;
  15. y=b0.*a(2,i)+b1.*a(2,i+1)+b2.*a(2,i+2)+b3.*a(2,i+3); % 确定曲线的纵坐标y;
  16. if u==0
  17. plot(x,y,'o');
  18. hold on
  19. end
  20. b=[b;x];
  21. c=[c;y];
  22. end
  23. end
  24. plot(b,c,'r.');%绘制曲线坐标点;
  25. hold on

复制代码
运行结果如下图
微信截图_20190211160107.png
(2)确定了上述程序正确无误,于是我研究如何由“型值点”生成“控制顶点”,从而重复(1)的步骤,最终由“型值点”生成“3次均匀B样条”,但是按照“B样条插值”理论写完程序后却发现最终生成的B样条曲线出现了错误。代码和图片如下:
  1. %%%%%%%%%%%%%%%%%%%第一步:由型值点矩阵P求取控制顶点矩阵V %%%%%%%%%%%%%%%
  2. P=[10 30;20 30;30 10;40 10;50 30;60 30;70 10;80 10;90 30;100 30;110 10;120 20];
  3. h=size(P,1);%h为P矩阵的行数,即插值点的个数;
  4. V=zeros((h+2),2);%V为控制顶点矩阵,首先利用zeros构造全0矩阵;
  5. A=zeros(h);%A为系数矩阵
  6. A(1,1)=3;A(2,1)=1/4;A(2,2)=7/12;A(2,3)=1/6;%系数的第一行和第二行单独赋值;
  7. for i=3:(h-2) %利用for循环给第3~(h-2)行赋值;
  8.     A(i,i-1)=1/6;
  9.     A(i,i)=2/3;
  10.     A(i,i+1)=1/6;
  11. end
  12. A((h-1),(h-2))=1/6;A((h-1),(h-1))=7/12;A((h-1),h)=1/4;A(h,(h-1))=0;A(h,h)=3;%矩阵的最后两行单独赋值;
  13. H= A^-1;%对矩阵A求取逆矩阵;
  14. C=(H)*P; %A的逆矩阵左乘型值点矩阵
  15. V(1,1)=P(1,1); %控制顶点的第一行第一列单独赋值;
  16. V(1,2)=P(1,2); %控制顶点的第一行第二列单独赋值;
  17. for j=2:(h+1) %利用for循环给控制顶点矩阵第2~(h+1)行赋值;
  18.     V(j,1)=C((j-1),1);
  19.     V(j,2)=C((j-1),2);
  20. end
  21. V((h+2),1)=P(h,1); %控制顶点的第(h+2)行第一列单独赋值;
  22. V((h+2),2)=P(h,2); %控制顶点的第(h+2)行第二列单独赋值;
  23. [K,I]=sortrows(V,1); %对控制顶点矩阵的第一列按照由小到大的顺序排序;
  24. %%%%%%%%%%%%%%%%第二步:由控制顶点生成B样条 %%%%%%%%%%%%%%%%%%%%%%
  25. a=K';% 对排序后的控制顶点矩阵K进行转置;
  26. b=[];
  27. c=[];
  28. plot(a(1,:),a(2,:),':'); % 绘制控制多边形;
  29. hold on; % 默认为hold off,此命令用来保留控制多边形的图形;
  30. N= size(a,2)-3;
  31. for i=1:N ; % for i=1:N,N由a的列数减去3 ;
  32. for u=0:0.001:1;% 参数u;
  33. b0=1.0./6.*(1-u).^3; % 基函数b0;
  34. b1=1.0./6.*(3.*u.^3-6.*u.^2+4); % 基函数b1;
  35. b2=1.0./6.*(-3.*u.^3+3.*u.^2+3.*u+1); % 基函数b2;
  36. b3=1.0./6.*u.^3; % 基函数b3;
  37. x=b0.*a(1,i)+b1.*a(1,i+1)+b2.*a(1,i+2)+b3.*a(1,i+3); % 确定曲线的横坐标x;
  38. y=b0.*a(2,i)+b1.*a(2,i+1)+b2.*a(2,i+2)+b3.*a(2,i+3); % 确定曲线的纵坐标y;
  39. if u==0
  40. plot(x,y,'o');
  41. hold on
  42. end
  43. b=[b;x];
  44. c=[c;y];
  45. end
  46. end
  47. plot(b,c,'r.');%绘制曲线坐标点;
  48. hold on
复制代码
运行结果如下图

微信截图_20190211162018.png

生成的B样条只有部分穿过“型值点”,求高手修改程序并发送至我的邮箱455962633@qq.com.验证程序正确后立刻发红包,决不食言!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表