function draw_bezier
global Dim;
global NumPoint;
global t;
figure(1)
axis([0 5 0 5]);
point_num=4;
fprintf('***请在图中点击鼠标输入%d个点***\r\n',point_num);
% [a,b]=ginput(point_num); %ginput(n) n为输入点的个数
for k = 1:1:point_num
axis([0 7 0 7]);
grid on;
[a(k),b(k)]=ginput(1);
plot(a(k),b(k),'ok');
hold on;
end
vertices=[a;b];
clf; %清除图形
[hl,h2] = bezier(vertices);
for i = length(vertices):-1:1
hp(i) = patch('xdata',vertices(1,i),'ydata',vertices(2,i),...
'linestyle','none','facecolor','none',...
'marker','o','markerEdgecolor','k',...
'buttonDownFcn',@drag,'userdata',i); %i的值传给userdata
end
ax = gca;
xl = get(ax,'xlim');
yl = get(ax,'ylim');
idx = [];
of = [];
function drag(src,~)
idx = get(src,'userdata');
of = get(gcbf,{'WindowButtonMotionFcn','WindowButtonUpFcn'});
set(gcbf,'WindowButtonMotionFcn',@move,'WindowButtonUpFcn',@drop);
end
function move(~,~)
cp = get(ax,'currentPoint');
xn = min(max(cp(1),xl(1)),xl(2));
yn = min(max(cp(3),yl(1)),yl(2));
% xn=cp(1,1);
% yn=cp(1,2);
set(hp(idx),'xdata',xn,'ydata',yn)
hl.XData(idx) = xn;
% hl.XData %显示h1句柄对应点的所有横坐标
hl.YData(idx) = yn;
if Dim==2
xn2=(1-t).^(NumPoint)*hl.XData(1);
yn2=(1-t).^(NumPoint)*hl.YData(1);
for j=1:NumPoint
w=factorial(NumPoint)/(factorial(j)*factorial(NumPoint-j))*(1-t).^(NumPoint-j).*t.^(j); %函数factorial(n) 计算阶乘
xn2=xn2+w*hl.XData(j+1);
yn2=yn2+w*hl.YData(j+1);
end
end
h2.XData = xn2;
h2.YData = yn2;
end
function drop(src,~)
set(src,'WindowButtonMotionFcn',of{1},'WindowButtonUpFcn',of{2});
end
end