用 GUI 画猴皮筋画线遇到的问题
我在用猴皮筋方法编程画线遇到的一个很奇怪的问题。不知道有没有高手可以指导。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(,,'-k');
end
现在出现的问题是: 画线没有任何问题。但是第二次点击鼠标时,大部分时间画线程序并不终止,往往只是在突然改变鼠标位置时迅速点击鼠标,才能终止画线程序运行。而且如果把最后一句绘图指令注释掉以后,程序就完全正常。点击鼠标就能顺利触发ButtonDownFcn函数的运行。
不知道plot指令如何影响鼠标点击ButtonDownFcn函数的执行。而且更奇怪的是我把最后一句错写成plot(,,'-k')就不存在此问题。
恳请高手不吝赐教
[ 本帖最后由 eight 于 2007-12-16 16:05 编辑 ] 跟我之前遇到情况差不多,“但是第二次点击鼠标时,大部分时间画线程序并不终止”。觉得应该是终止后又重新开始,检查循环以及退出的条件。 谢谢回复。我找到原因了。是因为画出线以后,再点击鼠标就点在了新画的线上,所以使用image的ButtonDownFcn函数就不能触发。添加一句set(handles.line,'ButtonDownFcn','img_ButtonDownFcn')就可以解决问题。写错的程序没有这个问题是因为光标和新画的线不重叠。
页:
[1]