2

我有一个循环,在其中我不断使用 ginput 将点输入到图中。我希望循环一直运行,直到用户按下一个键,这就是我所拥有的:

function enter_points()
    f = figure();
    axis([-1 1 -1 1]);

    coorX = [];
    coorY = [];

    while 1
        [x, y] = ginput(1);
        coorX = [coorX x];
        coorY = [coorY y];

        waitforbuttonpress;
        key = get(f,'CurrentCharacter');
        if (key == 'e')
            display('End of cycle.')
            break;
        else
            display('Enter next point')
        end
    end

    coor = [transpose(coorX) transpose(coorY)];
    display(size(coor));
    display(coor);
end

这段代码的问题是,我必须按一个键才能继续输入点。另一个问题是,Matlab 在运行此代码时有时会冻结(我不确定代码是原因还是其他原因)。以及如何检测按“enter”而不是“e”?谢谢你的帮助

4

3 回答 3

3

AFAIK,在 OOP 和面向事件的编程中处理问题的一般方法是生成给定事件的侦听器,在您的情况下是类似keypress事件。在定义侦听器时,通常会传递一个回调函数,以便在事件生成时调用(-back)。

可以在 matlab GUI 中定义侦听器(参考)。尽管如此,我不确定在控制台级别生成事件时是否可以做到这一点。

于 2012-11-13T09:33:14.940 回答
3

你为什么不使用内置:

[X,Y] = ginput 收集无限数量的点,直到按下返回键。

于 2012-11-13T09:47:24.937 回答
2

bdecaf 已经为您提供了最简单的答案,但您也可以尝试以下几个更改:

1)改变这个:

[x, y] = ginput(1);

对此:

[x, y, key] = ginput(1);

ginput 还会返回您按下的键,甚至返回哪个鼠标按钮(1:LB、2:RB 或 3:MB)。

2)删除这些行:

waitforbuttonpress;
key = get(f,'CurrentCharacter');

通过这些更改,您的例程应该按预期工作。点之间没有停顿,按[e]退出。

于 2012-11-13T11:47:07.393 回答