马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
我在用猴皮筋方法编程画线遇到的一个很奇怪的问题。不知道有没有高手可以指导。
figure下面有一个axis对象,并在上面使用imagesc命令绘图。我想用鼠标控制在图上划出一条直线。点击第一次鼠标时,图上将出现一个以点击位置为起点,鼠标目前位置为终点的直线。点击第二次鼠标,直线画完,不再有变化。比较典型的猴皮筋方法。我的主要代码是
function test_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for test
handles.output = hObject;
% Update handles structure
axis(handles.axes1);
str_user=struct('FlagDraw',{},'PrePosition',{},'CurtPosition',{});
str_user(1).FlagDraw=0;
set(handles.figure1,'userdata',str_user);
handles.img=imagesc(Im); % 绘图,并给句柄赋值
guidata(hObject, handles);
function OK_Callback(hObject, eventdata, handles) % 点击按钮 "OK" 触发开始画线
set(handles.img,'ButtonDownFcn',{@img_ButtonDownFcn,handles});
guidata(hObject, handles);
function img_ButtonDownFcn(hObject, eventdata, handles);
userdata=get(handles.figure1,'userdata');
if userdata(1).FlagDraw==0
userdata(1).FlagDraw=1;
userdata(1).PrePosition=get(gca,'currentpoint');
elseif userdata(1).FlagDraw==1
userdata(1).FlagDraw=0;
set(handles.img,'ButtonDownFcn',''); % 终止画线
userdata(1).CurtPosition=get(gca,'currentpoint');
end
set(handles.figure1,'userdata',userdata);
guidata(hObject, handles);
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles) % 移动鼠标时画线
userdata=get(hObject,'userdata');
if userdata.FlagDraw==1
userdata(1).CurtPosition=get(gca,'currentpoint');
x1=round(userdata(1).PrePosition(1,1)); y1=round(userdata(1).PrePosition(1,2));
x2=round(userdata(1).CurtPosition(1,1)); y2=round(userdata(1).CurtPosition(1,2));
findline=findobj(gca,'type','line');
if ~isempty(findline)
delete(findline)
end
hold on
handles.line=plot([x1 x2],[y1 y2],'-k');
end
现在出现的问题是: 画线没有任何问题。但是第二次点击鼠标时,大部分时间画线程序并不终止,往往只是在突然改变鼠标位置时迅速点击鼠标,才能终止画线程序运行。而且如果把最后一句绘图指令注释掉以后,程序就完全正常。点击鼠标就能顺利触发ButtonDownFcn函数的运行。
不知道plot指令如何影响鼠标点击ButtonDownFcn函数的执行。而且更奇怪的是我把最后一句错写成plot([x1 y1],[x2 y2],'-k')就不存在此问题。
恳请高手不吝赐教
[ 本帖最后由 eight 于 2007-12-16 16:05 编辑 ] |