声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1050|回复: 2

[GUI界面] 用 GUI 画猴皮筋画线遇到的问题

[复制链接]
发表于 2007-12-15 07:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-12-15 11:27 | 显示全部楼层
跟我之前遇到情况差不多,“但是第二次点击鼠标时,大部分时间画线程序并不终止”。觉得应该是终止后又重新开始,检查循环以及退出的条件。
 楼主| 发表于 2007-12-17 21:50 | 显示全部楼层
谢谢回复。我找到原因了。是因为画出线以后,再点击鼠标就点在了新画的线上,所以使用image的ButtonDownFcn函数就不能触发。添加一句set(handles.line,'ButtonDownFcn','img_ButtonDownFcn')就可以解决问题。写错的程序没有这个问题是因为光标和新画的线不重叠。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-23 17:15 , Processed in 0.057529 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表