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

このコードの問題点は、ポイントを入力し続けるためにキーを押さなければならないことです。もう 1 つの問題は、このコードを実行すると Matlab が時々フリーズすることです (コードが原因かどうかはわかりません)。また、「e」ではなく「enter」を押すことを検出する方法は? 助けてくれてありがとう

4

3 に答える 3

3

私の知る限り、OOP とイベント指向プログラミングで問題を処理する一般的な方法は、特定のイベント (この場合は -like イベント) のリスナーを生成することkeypressです。リスナーを定義するときは、通常、イベントが生成されたときに呼び出される (-back)コールバック関数を渡します。

たとえば、matlab GUI でリスナーを定義することができます (参照)。それにもかかわらず、イベントがコンソールレベルで生成されたときにそれができるかどうかはわかりません.

于 2012-11-13T09:33:14.940 に答える
3

ビルトインを使用しないのはなぜですか:

[X,Y] = ginput は、リターン キーが押されるまで無制限の数のポイントを収集します。

于 2012-11-13T09:47:24.937 に答える
2

bdecafはすでに最も簡単な答えを提供していますが、次の2つの変更を試すこともできます。

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 に答える