はじめに
あるロゴに対して目がぎょろぎょろ動くように加工された画像も少し前に流行りましたが、それに関連して作ったコードをここで供養しておきます。
関連記事
コールバック関数を使用した例としては以下の記事もありますのでぜひ参照ください。
- [MATLABでお絵描きツールを作ってみた (マウス操作イベントに応じたプログラム例)]
(https://qiita.com/sanmojih/items/5ac9ed1510da863d42f2) by @sanmojih さん - MATLAB でゲームを作る ~1. コールバック編~ by @macht さん
- 【MATLAB/AppDesigner】波形をマウスドラッグで範囲選択する by @dokagui_tairan さん
特に @macht さんの記事はコールバック関数自体の説明も丁寧にまとめられているのでオススメ。
環境
- MATLAB R2020a
コールバック関数
Figure にはマウス操作に関するコールバック関数が 3 つあります1。
コールバック関数 | 概要 |
---|---|
WindowButtonDownFcn | マウスをクリックしたときに呼びだされるコールバック関数 |
WindowButtonMotionFcn | マウスを動かしたときに呼びだされるコールバック関数 |
WindowButtonUpFcn | マウスを離したときに呼びだされるコールバック関数 |
ここではカーソルの移動を追いかけるだけなので WindowButtonMotionFcn
を使用します。
% コールバック関数を設定
figure('WindowButtonMotionFcn',@myFcn);
これでカーソル位置が移動中は myFcn
(下で定義) が呼び出されることになります。
円の描画
ここはサクッと陰関数で描画。fimplicit
関数(ヘルプページ)を使います。
fimplicit(@(x,y) x.^2+y.^2-1,[-2,2,-2,2])
カーソル位置取得
これは axes オブジェクトの CurrentPoint
で取れます。
% カーソルの位置取得
cp = ah.CurrentPoint;
mouseMotionExample.m
以上をまとめると・・以下の通りです。遊んでみてください。
mouseMotionExample.m
function mouseMotionExample
% コールバック関数を設定
figure('WindowButtonMotionFcn',@myFcn);
% 円を描画
ah = axes;
fimplicit(ah, @(x,y) x.^2+y.^2-1,[-2,2,-2,2])
axis equal
hold on
% 動かす対象の点を作成
ph = plot(nan,nan,'MarkerSize',10,...
'Marker','o','MarkerFaceColor','k');
hold off
function myFcn(src,callbackdata)
% カーソルの位置取得
cp = ah.CurrentPoint;
xMouse = cp(1,1); % x 座標
yMouse = cp(1,2); % y 座標
% 円の中心とカーソル位置を結んだ線分上で
% 中心からの距離が 0.8 のところに点を移動
r0 = 0.8;
r = sqrt(xMouse.^2 + yMouse.^2);
ph.XData = xMouse/r*r0;
ph.YData = yMouse/r*r0;
end
end