15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-09-13

はじめに

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

mouseMotionExample.gif

関連記事

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

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

  1. MATLABでお絵描きツールを作ってみた (マウス操作イベントに応じたプログラム例) から引用

15
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?