2

目的: imshow で表示された画像を含む 1 つの Figure で複数のクリックを実行し、「クリックされた」ポイントの座標を保存して、以降の操作で使用すること。

注:関数については知っていますgetptsginput、それらを使用せずにこれを実行したいと思います。これは可能ButtonDownFcnですか?(次のコードを参照)

function testClicks
img = ones(300); % image to display
h   = imshow(img,'Parent',gca);
set(h,'ButtonDownFcn',{@ax_bdfcn});

function ax_bdfcn(varargin)
a = get(gca,'CurrentPoint');
x = a(1,1);
y = a(1,2);

この段階では、変数xyのみが 内で「生きています」 ax_bdfcn。関数でそれらを使用できるようにするにはどうすればよいtestClicksですか? これは可能ButtonDownFcnですか?これは良いアプローチですか?

どうもありがとう。

EDIT1: シャイさん、回答ありがとうございます。しかし、私はまだ私が意図したことを達成することはできません.

function [xArray, yArray] = testClicks()
img = ones(300); % image to display
h   = imshow(img,'Parent',gca);
x = [];
y = [];
xArray = [];
yArray = [];
stop = 0;
while stop == 0;
    set(h,'ButtonDownFcn',{@ax_bdfcn});
    xArray = [xArray x];
    yArray = [yArray y];
        if length(xArray)>15
            stop = 1;
        end
end

    function ax_bdfcn(varargin)
        a = get(gca, 'CurrentPoint');
        assignin('caller', 'x',  a(1,1) );
        assignin('caller', 'y',  a(1,2) );
    end
end % must have end for nested functions

このコード(バグがあります!)は、私が望むものに最も近いものです(すべてクリックした後、クリックされたポイントのx座標とy座標の配列を持っています)。このタスクを実装するためのメカニズムを明らかに理解していません。何か助けはありますか?

4

1 に答える 1

3

いくつかの方法があります

  1. 入れ子関数の使用

    function testClicks
       img = ones(300); % image to display
       h   = imshow(img,'Parent',gca);
       set(h,'ButtonDownFcn',{@ax_bdfcn});
       x = []; % define "scope" of x and y 
       y = [];  
    
       % call back as nested function
       function ax_bdfcn(varargin)
           a = get(gca,'CurrentPoint');
           x = a(1,1); % set x and y at caller scope due to "nested"ness of function
           y = a(1,2);
       end  % close nested function
    end % must have end for nested functions
    
  2. 使用するassignin

    function ax_bdfcn(varargin)
         a = get(gca, 'CurrentPoint');
         assignin('caller', 'x',  a(1) );
         assignin('caller', 'y',  a(2) ); 
    
  3. 'UserData'フィギュアハンドルのプロパティを使用

    function ax_bdfcn(varargin)
         a = get(gca, 'CurrentPoint');
         set( gcf, 'UserData', a(1:2) );
    

    'UserData'を使用して(フィギュアが生きている限り)アクセスできますcp = get( gcf, 'UserData');

編集:クリックした場所をワークスペース
に「伝達」する方法の例'base'

function ax_bdfcn(varargin)
   a = get(gca,'CurrentPoint');
   % the hard part - assign points to base
   if evalin('base', 'exist(''xArray'',''var'')')
      xArray = evalin('base','xArray');
   else 
      xArray = [];
   end
   xArray = [xArray a(1)]; % add the point
   assignin('base','xArray',xArray); % save to base
   % do the same for yArray

呼び出した後、ワークスペースにtestClicksNOxArrayまたはyArray変数があります(少なくともあるべきではありません)。最初のクリック後、これら2つの変数が「奇跡的に」作成されます。1つおきにクリックすると、図を閉じるまで、これら2つの配列のサイズが大きくなります。

于 2013-03-04T13:11:26.983 に答える