- 积分
- 0
- 注册时间
- 2009-9-27
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2009-12-10 22:15:25
|
显示全部楼层
|阅读模式
来自 大连理工大学北山B区
本帖最后由 messenger 于 2009-12-15 14:04 编辑
%用B-样条曲线拟合数据
clear,clc
prompt={'在此输入点坐标,要求每行输入一个点的坐标,横、纵坐标值之间用空格或半角逗号隔开,输完一个点坐标后按下回车键再输入下一个点坐标'};
name='数据输入';
numlines=[20,19];
dia1=inputdlg(prompt,name,numlines);%生成点坐标输入对话框
A=[str2num(dia1{1})];%用矩阵存储点坐标
L=size(A);
N=L(1);%记录点的个数
plot(A(:,1),A(:,2),'*-r');%画出点
hold on;
prompt={'请输入曲线阶次,若用二次B样条,输入"2";若用三次B样条,则输入"3"'};
name='B-样条阶次选择';
numlines=[1,19];
dia2=inputdlg(prompt,name,numlines);%生成阶次输入对话框
b=[str2num(dia2{1})];%提取样条阶次
while b~=2&b~=3
prompt={'请重新输入曲线阶次,若用二次B样条,输入"2";若用三次B样条,则输入"3"'};
name='B-样条阶次选择';
numlines=[2,20];
dia2=inputdlg(prompt,name,numlines);
b=[str2num(dia2{1})];%提取样条阶次
end
switch b
case 2 %画二次B样条曲线
for i=1:(N-2)
for t=0:0.001:1
x=((t-1)^2*A(i,1)+(-2*t^2+2*t+1)*A(i+1,1)+t^2*A(i+2,1))/2;
y=((t-1)^2*A(i,2)+(-2*t^2+2*t+1)*A(i+1,2)+t^2*A(i+2,2))/2;
plot(x,y,'b');
hold on
end
end
case 3 %画三次B样条曲线
for i=1:(N-3)
for t=0:0.001:1
x=((-t^3+3*t^2-3*t+1)*A(i,1)+(3*t^3-6*t^2+4)*A(i+1,1)+(-3*t^3+3*t^2+3*t+1)*A(i+2,1)+t^3*A(i+3,1))/6;
y=((-t^3+3*t^2-3*t+1)*A(i,2)+(3*t^3-6*t^2+4)*A(i+1,2)+(-3*t^3+3*t^2+3*t+1)*A(i+2,2)+t^3*A(i+3,2))/6;
plot(x,y,'b');
hold on
end
end
end
hold off |
评分
-
1
查看全部评分
-
|