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

45 views (last 30 days)
denpika
denpika on 13 Jul 2020
Commented: denpika on 16 Jul 2020
下記リンクを参考にグラフ描画をアニメーションで指定した更新頻度で実行したいのですが上手くいきません。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 Comments
Kenta
Kenta on 13 Jul 2020
Edited: Kenta on 13 Jul 2020
animated lineをGIFで保存して、その時のdelay timeを調整したら、望む形のインターバルになりませんかね。上のURLのGIFの欄、お役に立てば嬉しいです。
denpika
denpika on 13 Jul 2020
教えていただきありがとうございます。
GIFに保存すれば再生時間など調整できそうですが、MATLAB上でGUI的に動作をさせたい(パラメータ変更→データ観察したい)ので、実施したいこととは異なりました。
説明が不足していてすみませんでした。

Sign in to comment.

Accepted Answer

Takumi
Takumi on 13 Jul 2020
Edited: Takumi on 13 Jul 2020
大体の時間があっていれば良いなら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 Comment
denpika
denpika on 16 Jul 2020
3つの方法で教えていただきありがとうございました。
3つ目のTimerクラスを使う方法が最も実施したいことに合いました。
ミリ秒でずれることありますが、それほど長いデータを使わなければ十分でした。

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!