weich 发表于 2007-12-15 07:35

用 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 编辑 ]

花如月 发表于 2007-12-15 11:27

跟我之前遇到情况差不多,“但是第二次点击鼠标时,大部分时间画线程序并不终止”。觉得应该是终止后又重新开始,检查循环以及退出的条件。

weich 发表于 2007-12-17 21:50

谢谢回复。我找到原因了。是因为画出线以后,再点击鼠标就点在了新画的线上,所以使用image的ButtonDownFcn函数就不能触发。添加一句set(handles.line,'ButtonDownFcn','img_ButtonDownFcn')就可以解决问题。写错的程序没有这个问题是因为光标和新画的线不重叠。
页: [1]
查看完整版本: 用 GUI 画猴皮筋画线遇到的问题