1、前记:
(1)鼠标交互生成三次样条曲线
(2)鼠标交互调整点的位置
2、代码:
(1)首先看一个指定点,并将点按交互序列链接起来的例子
-
function draw_lines
-
%
Click
the
left
mouse
button
to
define
a
point
-
%
Drag
the
mouse
to
draw
a
line
to
the
next
point
and
-
%
left
click
again
-
%
Right
click
the
mouse
to
stop
drawing
-
%
-
figure
('WindowButtonDownFcn',@wbdcb)
-
ah =
axes
('DrawMode','fast');
-
clc
-
axis ([
1
10
1
10])
-
function wbdcb(src,evnt)
-
if strcmp(get(src,'SelectionType'),'normal')
-
[x,y,str] = disp_point(ah);
-
hl = line(
'XData',x,
'YData',y,
'Marker',
'.');
-
text(x,y,str,
'VerticalAlignment',
'bottom');drawnow
-
set(src,
'WindowButtonMotionFcn',@wbmcb)
-
elseif strcmp(get(src,
'SelectionType'),
'alt')
-
set(src,
'WindowButtonMotionFcn',
'')
-
[x,y,str] = disp_point(ah);
-
text(x,y,str,
'VerticalAlignment',
'bottom');drawnow
-
end
-
function wbmcb(src,evnt)
-
[
xn,
yn,
str] =
disp_point
(ah);
-
xdat = [x,xn];
-
ydat = [y,yn];
-
set(hl,
'XData',xdat,
'YData',ydat);
-
end
-
end
-
function [x,y,str] = disp_point(ah)
-
cp =
get
(ah,'CurrentPoint');
-
x = cp(
1,
1);y = cp(
1,
2);
-
str = [
'(',num2str(x,
'%0.3g'),
', ',num2str(y,
'%0.3g'),
')'];
-
end
-
end
效果:在figure中左键点击,留下该点位置,继续点击,生成的点序列进行线段连接,如此下去直到右键点击生成点和线段结束。(相当于指定点后生成的路径)
(2)在上一个基础上,生成点并生成点的三次样条曲线
-
function draw_lines1_splinecurve
-
%
Click
the
left
mouse
button
to
define
a
point
-
%
Drag
the
mouse
to
draw
a
line
to
the
next
point
and
-
%
left
click
again
-
%
Right
click
the
mouse
to
stop
drawing
-
clc
-
clear
-
figure
('WindowButtonDownFcn',@wbdcb);
-
k=
1;
-
ah = axes(
'DrawMode',
'fast');
-
clc
-
grid
on;
-
axis ([-
20
20 -
20
20]);%open the
file
to save the coordinates into
-
fileID = fopen(
'coord.txt',
'w');
-
function wbdcb(src,evnt)
-
if strcmp(get(src,'SelectionType'),'normal')
-
[x,y,str] = disp_point(ah); %
write the coordinates into the
file
-
A=[x,y];
-
fprintf(fileID,
'%6.2f %6.2f\n',A);
-
hl = line(
'XData',x,
'YData',y,
'Marker',
'.');
-
text(x,y,str,
'VerticalAlignment',
'bottom');drawnow;
-
set(src,
'WindowButtonMotionFcn',@wbmcb);
-
elseif strcmp(get(src,
'SelectionType'),
'alt')
-
set(src,
'WindowButtonMotionFcn',
'');
-
[x,y,str] = disp_point(ah); %
write the coordinates into the
file
-
A=[x,y];
-
fprintf(fileID,
'%6.2f %6.2f\n',A);
-
text(x,y,str,
'VerticalAlignment',
'bottom');drawnow;
-
fclose(fileID);
-
end
-
A1=importdata(
'coord.txt',
'%f');
-
h = findobj(
'type',
'line',
'tag',
'ax1');
-
delete(h);
-
if size(A1,
1)>
2
-
xx=zeros(size(A1,
1),
1);
-
yy=zeros(size(A1,
1),
1);
-
for i=
1:size(A1,
1)
-
xy=str2num(A1
{i, 1});
-
xx(i)=xy(
1);
-
yy(i)=xy(
2);
-
end
-
hold
on
-
fnplt(cscvn([xx
';yy']))
-
end
-
function wbmcb(src,evnt)
-
[
xn,
yn,
str] =
disp_point
(ah);
-
xdat = [x,xn];
-
ydat = [y,yn];
-
set(hl,
'XData',xdat,
'YData',ydat);
-
end
-
end
-
function [x,y,str] = disp_point(ah)
-
%
P1 =
impoint
(gca,[]);
-
cp = get(ah,
'CurrentPoint');
-
x = cp(
1,
1);y = cp(
1,
2);
-
str = [
'(',num2str(x,
'%0.3g'),
', ',num2str(y,
'%0.3g'),
')'];
-
end
-
end
效果: 各点之间生成光滑三次样条曲线
(3)生成点再次修改点位
-
%
Plot a line and points
-
figure
-
plot(1:10,1:10,'-o','buttondownfcn',{@Mouse_Callback,'down'});
-
-
%
Callback function for each point
-
function Mouse_Callback(hObj,~,action)
-
persistent curobj xdata ydata ind
-
pos =
get(gca,
'CurrentPoint');
-
switch action
-
case
'down'
-
curobj = hObj;
-
xdata =
get(hObj,
'xdata');
-
ydata =
get(hObj,
'ydata');
-
[
~,ind] = min(sum((xdata-pos(
1)).^
2+(ydata-pos(
3)).^
2,
1));
-
set(gcf,...
-
'WindowButtonMotionFcn', {@Mouse_Callback,
'move'},...
-
'WindowButtonUpFcn', {@Mouse_Callback,
'up'});
-
case
'move'
-
%
vertical move
-
ydata(
ind) = pos(
3);
-
xdata(ind) = pos(
2);
-
set(curobj,
'xdata',xdata)
-
set(curobj,
'ydata',ydata)
-
case
'up'
-
set(gcf,...
-
'WindowButtonMotionFcn',
'',...
-
'WindowButtonUpFcn',
'');
-
end
-
end
转载:https://blog.csdn.net/weixin_39090239/article/details/116702976
查看评论