質問: マウスの動きに合わせてグラフィックスオブジェクトを移動させることはできますか? figure 上に描画されているラインや patch などのオブジェクトをマウスでドラッグし、移動させる方法を教えてください。
回答: マウスでグラフィックスオブジェクトを移動するには、figure オブジェクトの以下のコールバック関数を使用します。 windowbuttondownfcn : figure上でマウスを押した時に実行されるコールバック関数 windowbuttonmotionfcn : figure 上でマウスを動かした時に実行されるコールバック関数 windowbuttonupfcn : figure 上でマウスを放した時に実行されるコールバック関数 これらの各コールバック関数を次のように使用します。 1. マウスが押されたら、windowsbuttonmotionfcn を設定する(windowbuttondownfcn のコールバック) 2. マウスの移動中は、マウスの現在値を取得し、オブジェクトの位置を逐次変更する(windowbuttonmotionfcn のコールバック) 3. マウスを放したら、windowsbuttonmotionfcn を削除する(windowbuttonupnfcn のコールバック) 以下のプログラムは、patch オブジェクトをマウスのドラッグにより移動する例です。 function test1 % patch オブジェクトをマウスで動かすサンプル例 % figure に各種コールバックを設定 figure('windowbuttondownfcn',@mybdcallback,'windowbuttonupfcn',@mybucallback) axis([-1,2,-1,2,-1,2]); xlabel('x'), ylabel('y'), view(3); h = patch([-1,2,2,-1],[-1,-1,2,2],[1,1,1,1],'b'); % 面を表示 function mybdcallback(src,eventdata) % windowbuttondownfcn % マウスを押したときのコールバック関数 set(src,'windowbuttonmotionfcn',@mybmcallback); function mybmcallback(src,evnt) % windowbuttonmotionfcn % マウスを動かしたときのコールバック関数 cp = get(gca,'currentpoint'); % 座標軸上のマウスの位置を取得 zf = cp(1,3); % 前面側の z 軸上の位置 zb = cp(2,3); % 背面側の z 軸上の位置 zp = zf+(zb-zf)/2; % z軸上のマウス位置 set(h,'zdata',repmat(zp,4,1)) % patch の高さを変更 drawnow % 強制描画 end end function mybucallback(src,evantdata) % windowbuttonupfcn % マウスを放したときのコールバック関数 set(src,'windowbuttonmotionfcn',''); end end 各種コールバックの詳細については、以下の url をご覧下さい。 ・matlab ヘルプドキュメント:関数ハンドルコールバック