1

マウスオーバー機能のコードを開発しようとしています。私が必要とするのは次のとおりです。

1.) マウスがプロットの境界内にある場合は小さな十字カーソルに変更し、プロットの境界外にある場合は矢印に戻すことができるようにします。

2.) プロット境界内のポイントをクリックしてプロットし、カーソル タイプの小さな十字線を維持できるようにします。

私は働くための最初の要件を得ました。2番目に問題があります。mathworks の変更された ginput 関数 myginput を使用しようとしています。myginput 関数内で、関数を myginput() に変更し、arg1 == 1 を設定し、strpointertype = 'Crosshair' を設定しました。

mouseover.m を作成している関数内から、カーソルがプロット境界内にあるかどうかを確認する if/else ステートメント内で、myginput を呼び出すように ButtonDownFcn を設定します。プログラムを実行してプロット境界内をクリックしようとすると、@myginput を使用して「入力引数が多すぎます」というエラーが発生します。myginput 関数で既に指定しているため、入力引数は使用していません。

これを修正する方法について何か提案はありますか? メイン GUI は、mouseover 関数を次のように呼び出します。

set (gcf, 'WindowButtonMotionFcn', @mouseover);

プロット用の軸ハンドルは plot_data です。したがって、タグ plot_data を持つプロットでダミー GUI (アルファ) を作成し、この GUI 内でグローバル変数を設定するだけです。

function varargout = alpha_OutputFcn(hObject, eventdata, handles) 
global plot_data


% Get default command line output from handles structure
varargout{1} = handles.output;

% now attach the function to the axes
set(gca,'ButtonDownFcn', @mouseclick)


set (gcf, 'WindowButtonMotionFcn', @mouseover);

以下は、mouseover.m 関数のコードです。

function [data] = mouseover(gcbo,eventdata,handles)
global plot_data


cp = get(gca,'Position');           %get postion data of the current axes

LeftBound = cp(1);
RightBound = LeftBound + cp(3);

LowerBound = cp(2);
UpperBound = LowerBound + cp(4);

%check to see if mouse is within the bounds of the axes
in_bounds = @(mx, my) LeftBound < mx && mx < RightBound && LowerBound < my && my < UpperBound;

mp = get(gcf, 'CurrentPoint');      %get current position of mouse

if in_bounds(mp(1,1),mp(1,2)) == 1
    set(gcf,'pointer','Crosshair');
    set(gca,'ButtonDownFcn', @myginput)
else
    set(gcf,'pointer','Arrow');
end
4

1 に答える 1

0

http://www.mathworks.com/matlabcentral/fileexchange/12770のファイル交換で利用可能な myginput を参照している場合、コールバックとして使用するために書かれているようには見えません。ButtonDownFcn のコールバック関数は、常に 2 つの入力引数を取る必要があります。src と eventData です。http://www.mathworks.com/help/matlab/creating_plots/function-handle-callbacks.htmlにある関数ハンドル コールバックのドキュメントを参照してください。必要な 2 つの入力を受け取る独自の関数を定義し、その関数内から myginput を呼び出すことができます。

于 2013-02-05T02:50:21.137 に答える