|

clear %清除所有已定义的变量
clc %清空命令窗口
clf %清空图形窗口
grid on %显示绘图网格线
hold on
axis([-1,1,-1,1]) %设置绘图区坐标范围
x=[]; %初始化坐标数组
y=[];
[px,py,button]=ginput(1);%拾取第一个点
while button==1 %当鼠标按键是左键则重复拾取,其它按键则退出循环
plot(px,py,'ro'); %绘制拾取的点
x=[x;px]; %保存拾取点坐标
y=[y;py];
[px,py,button]=ginput(1);
end
plot(x,y,'b-') %绘制通过拾取点的连线
daspect([1 1 1]) %确保绘图区的坐标比例为1
hold off
% 计算以这两个点为端点且角度为60°的NURBS圆弧
t = linspace(0,1,100);
P = [x';y';zeros(1,2)]; % 控制点矩阵
w = [1,sin(pi/6)/cos(pi/6),1]; % 权重向量
k = [0,0,0,1,1,2,2,2]; % 节点向量
n = length(k) - 4;
N = zeros(n,length(t));
for i = 1:n
N(i,:) = bspline_basis(i-1,3,k,t);
end
W = repmat(w',1,length(t));
Q = P'.* W;
B = (N .* W) ./ sum(N .* W);
C = Q * B;
X = C(1,:);
Y = C(2,:);
% 绘制圆弧和控制多边形
plot(X,Y,'-');
plot(P(1,:),P(2,:),'ro');
plot(P(1,:),P(2,:),'--');
title('NURBS圆弧');
legend('NURBS圆弧','控制点','控制多边形');
function N = bspline_basis(i,p,k,t)
% B样条基函数的递归定义
if p == 0
if k(i+1) <= t & t < k(i+2)
N = 1;
else
N = 0;
end
else
alpha = (t - k(i+1)) ./ (k(i+p+1) - k(i+1));
beta = (k(i+p+2) - t) ./ (k(i+p+2) - k(i+1));
N = alpha .* bspline_basis(i,p-1,k,t) + beta .* bspline_basis(i+1,p-1,k,t);
end
end
在计算60度nurbs曲线之前的是老师给的ginput代码,后面的Q=P'.*W一直报错,请问下怎么改
老师的原话:拾取两个不重合的点,计算以这两个点为端点且角度为60°的NURBS圆弧,并将控制点、控制多边形和圆弧绘制在同一张图中。提示:可采用88页的公式绘制。(10分) |
|