スライダーを使ってfigureを更新① | MATLAB事例紹介1

MATLAB事例紹介では、実際にご依頼を受けて作成した事例をもとに便利な機能を紹介していきます。

初回はスライダーを使ってfigureを更新する機能について説明します。

目標の確認

まず初めに今回作成する目標の確認をしたいと思います。

スライダーを使ってfigureを更新する

今回作成する予定のfigureは上図のものです。このfigureは太陽の周りを回る地球と、地球の周りを回る月を表しています。また青とオレンジのラインは地球と月の軌跡を表しています。※実際の縮尺とは異なります

スライダーの右矢印「▷」をクリックするとDayが「1」加算され、地球と月の位置が1日分移動します。

また、スライダーをドラッグしながら動かすと一気に日付を移動させることができます。

上記のfigureを作成するプログラムコードとその解説を行っていきます。

プログラムコードの確認

上記のスライダー付きのfigureを作成するプログラムコードの大まかな流れは下記の通りです。

1、パラメータの設定
2、地球と月の座標定義
3、figureの作成
4、figureにスライダーとテキストを設置
5、figure更新用の関数作成
6,スライダーを動かした際に更新用の関数呼び出す

MATLAB
clear;
clc;
close all;

%% 1,Parameter設定
Day = 1:1:365;

omega_earth = 2*pi / 365;

r_earth = 10;
r_r_earth = 100;

omega_moon = 2*pi / 27.3;
r_moon = 5;
r_r_moon = 20;

r_sun = 30;

%% 2,座標定義
x_earth = r_r_earth * cos(omega_earth*Day);
y_earth = r_r_earth * sin(omega_earth*Day);

x_moon = x_earth + r_r_moon * cos(omega_moon*Day);
y_moon = y_earth + r_r_moon * sin(omega_moon*Day);

%% 3,figure作成

fig1 = figure(1);
subplot(10,1,[1 9]);
hold on
h(1) = plot(x_earth(1),y_earth(1));
h(2) = plot(x_moon(1),y_moon(1));
Earth = rectangle('Position',[x_earth(1)-0.5*r_earth y_earth(1)-0.5*r_earth r_earth r_earth],'Curvature',[1 1],'FaceColor','b');
Moon = rectangle('Position',[x_moon(1)-0.5*r_moon y_moon(1)-0.5*r_moon r_moon r_moon],'Curvature',[1 1],'FaceColor','y');
Sun = rectangle('Position',[0-0.5*r_sun 0-0.5*r_sun r_sun r_sun],'Curvature',[1 1],'FaceColor','r');
axis equal
xlim([-150 150]);
ylim([-150 150]);

% 4,figureにテキストを設置
d = uicontrol(fig1,'Style','text');
d.Position = [180 30 200 20];
d.String = 'Day 1';

% 4,figureにスライダーを設置
c = uicontrol(fig1,'Style','slider');
c.Position = [20 30 200 20];
c.Value = 1;
c.Min = 1;
c.Max = 365;
c.SliderStep = [1/365 1/365];

% 6,figure更新
c.Callback = @(src,event)updatePosition(c,d,Earth,Moon,h,x_earth,y_earth,r_earth,x_moon,y_moon,r_moon);



%% 5,figure更新用関数を定義
function [] = updatePosition(c,d,Earth,Moon,h,x_earth,y_earth,r_earth,x_moon,y_moon,r_moon)
    i = uint32(c.Value);
    d.String = sprintf('Day %d',i);
    Earth.Position = [x_earth(i)-0.5*r_earth y_earth(i)-0.5*r_earth r_earth r_earth];
    Moon.Position = [x_moon(i)-0.5*r_moon y_moon(i)-0.5*r_moon r_moon r_moon];
    h(1).XData = x_earth(1:i);
    h(1).YData = y_earth(1:i);
    h(2).XData = x_moon(1:i);
    h(2).YData = y_moon(1:i);
end

1、パラメータの設定

パラメータの設定についてです。2行目で1~365日のベクトルを作成しています。4行目で地球の公転の角速度[rad/day]を設定。6,7行目で地球の半径と、公転半径をそれぞれ定義しています。(値は適当です)

9~13行目は月と太陽のパラメータ設定ですが、地球のパラメータ設定と同じため割愛します。月の公転周期は27.3日としました(9行目)。

MATLAB
%% 1,Parameter設定
Day = 1:1:365;

omega_earth = 2*pi / 365;

r_earth = 10;
r_r_earth = 100;

omega_moon = 2*pi / 27.3;
r_moon = 5;
r_r_moon = 20;

r_sun = 30;

2、地球と月の座標定義

続いては地球と月の座標を定義します。1~365日分のx,y座標を計算して、ベクトルに格納します。

地球のx座標 = 公転半径 × cosθ
地球のy座標 = 公転半径 × sinθ
θ = 角速度[rad/day] × 日数

となるので下記の1,2行目の式になります。

また月の座標については、地球の座標を中心とするためそれぞれ地球のx座標、y座標を加算していますが、基本は同じです。

MATLAB
%% 2,座標定義
x_earth = r_r_earth * cos(omega_earth*Day);
y_earth = r_r_earth * sin(omega_earth*Day);

x_moon = x_earth + r_r_moon * cos(omega_moon*Day);
y_moon = y_earth + r_r_moon * sin(omega_moon*Day);

3、figureの作成

続いてはfigureの作成です。このあとスライダーを使って更新するための準備も同時に行っています。

3行目でfigureを作成してfig1という変数に格納しています。後ほどfigure更新のため、関数にfig1を引数として利用するためです。

4行目でsubplotで10行分に分割し、1~9行目の領域にplotすることにします。スライダーを設置する領域を確保するためです。subplotの使い方はこちらで解説しております。

6,7行目でDay1の点のみplotしています。こちらは地球と月の軌跡をplotするためのものです。これらのplotもhという変数に格納していますが、先ほどと同じ理由で関数の入力引数に使用するためです。

8,9,10行目はrectangleという関数を用いて円を描画しています。Positionに[x座標 y座標 幅 高さ]の順で指定すれば目的に位置とサイズに図形が描けます。左下のx,y座標を指定するため、中心座標から半径分の引き算が必要です。また、rectangle(四角形)という意味ですが、Curvatureに[1,1]を指定すると円が描けます。

11,12,13行目でグラフの範囲の指定とx,yに均等なスケールになるように調整しています。

MATLAB
%% 3,figure作成

fig1 = figure(1);
subplot(10,1,[1 9]);
hold on
h(1) = plot(x_earth(1),y_earth(1));
h(2) = plot(x_moon(1),y_moon(1));
Earth = rectangle('Position',[x_earth(1)-0.5*r_earth y_earth(1)-0.5*r_earth r_earth r_earth],'Curvature',[1 1],'FaceColor','b');
Moon = rectangle('Position',[x_moon(1)-0.5*r_moon y_moon(1)-0.5*r_moon r_moon r_moon],'Curvature',[1 1],'FaceColor','y');
Sun = rectangle('Position',[0-0.5*r_sun 0-0.5*r_sun r_sun r_sun],'Curvature',[1 1],'FaceColor','r');
axis equal
xlim([-150 150]);
ylim([-150 150]);

以上で実行するとDay1のfigureを作成することができます。

4以降については次の記事で解説します。

関連記事

コメント

この記事へのコメントはありません。