【MATLAB】カーソルを追いかけるプロットの作り方


はじめに

あるロゴに対して目がぎょろぎょろ動くように加工された画像も少し前に流行りましたが、それに関連して作ったコードをここで供養しておきます。

関連記事

コールバック関数を使用した例としては以下の記事もありますのでぜひ参照ください。

特に @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