アニメーションの速度の制御について

45 ビュー (過去 30 日間)
denpika
denpika 2020 年 7 月 13 日
コメント済み: denpika 2020 年 7 月 16 日
下記リンクを参考にグラフ描画をアニメーションで指定した更新頻度で実行したいのですが上手くいきません。https://jp.mathworks.com/help/matlab/ref/animatedline.html
例えば、下記コードのようにT(0.02s)で計測したデータを
計測時間と同じように更新し12.56s(総計測時間)で再生を終えるようにしたいですが、
場合だと一瞬で描画が終わってしまいます。
また、再生時間を倍速(×0.5 ×2)する方法も教えていただきたく。
T = 1/50; % sampling rate 0.02s
h = animatedline;
axis([0,4*pi,-1,1])
x = 0:T:pi*4;
y = sin(x);
a = tic; % start timer
for k = 1:length(x)
addpoints(h,x(k),y(k))
b = toc(a); % check timer
if b > T
drawnow % update screen every T seconds
a = tic; % reset timer after updating
end
end
drawnow % draw final frame
  2 件のコメント
Kenta
Kenta 2020 年 7 月 13 日
編集済み: Kenta 2020 年 7 月 13 日
animated lineをGIFで保存して、その時のdelay timeを調整したら、望む形のインターバルになりませんかね。上のURLのGIFの欄、お役に立てば嬉しいです。
denpika
denpika 2020 年 7 月 13 日
教えていただきありがとうございます。
GIFに保存すれば再生時間など調整できそうですが、MATLAB上でGUI的に動作をさせたい(パラメータ変更→データ観察したい)ので、実施したいこととは異なりました。
説明が不足していてすみませんでした。

サインインしてコメントする。

採用された回答

Takumi
Takumi 2020 年 7 月 13 日
編集済み: Takumi 2020 年 7 月 13 日
大体の時間があっていれば良いならpause関数で停止させるのが簡単だと思います.ただし,関数を実行する時間を考慮していないので,ずれます.
T = 1/50; % sampling rate 0.02s
h = animatedline;
axis([0,4*pi,-1,1])
x = 0:T:pi*4;
y = sin(x);
tic
for k = 1:length(x)
addpoints(h,x(k),y(k))
drawnow
pause(T) % 再生時間を倍速にするにはTをT/2で置き換える
end
toc
それから,denpikaさんがやられている方法でやるならこんなかんじでしょうか.少し精度は上がりますが,まだ関数の実行時間を考慮していないところがあり,少しずれます.
T = 1/50; % sampling rate 0.02s
h = animatedline;
axis([0,4*pi,-1,1])
x = 0:T:pi*4;
y = sin(x);
k = 1;
tic % 総実行時間測定用
a = tic;
while 1
b = toc(a);
if b>=T % 再生時間を倍速にするにはTをT/2で置き換える
addpoints(h,x(k),y(k))
a = tic;
drawnow
k = k+1;
end
if k>length(x)
break;
end
end
toc
完全に合わせたいならTimerクラスを使うといいと思います.
global k
T = 1/50; % sampling rate 0.02s
h = animatedline;
axis([0,4*pi,-1,1])
x = 0:T:pi*4;
y = sin(x);
% timerクラス
tim = timer;
tim.TimerFcn = {@myTimerFunc,x,y,h};
tim.Period = T; % 再生時間を倍速にするにはTをT/2で置き換える
tim.TasksToExecute = length(x);
tim.ExecutionMode = 'fixedRate';
k=1;
start(tim); % start timer
tic;
while 1
if k>length(x)
break;
end
end
toc
function myTimerFunc(obj,event,x,y,h)
global k
addpoints(h,x(k),y(k));
drawnow
k=k+1;
end
  1 件のコメント
denpika
denpika 2020 年 7 月 16 日
3つの方法で教えていただきありがとうございました。
3つ目のTimerクラスを使う方法が最も実施したいことに合いました。
ミリ秒でずれることありますが、それほど長いデータを使わなければ十分でした。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeアニメーション についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!