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

45 Ansichten (letzte 30 Tage)
denpika
denpika am 13 Jul. 2020
Kommentiert: denpika am 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 Kommentare
Kenta
Kenta am 13 Jul. 2020
Bearbeitet: Kenta am 13 Jul. 2020
animated lineをGIFで保存して、その時のdelay timeを調整したら、望む形のインターバルになりませんかね。上のURLのGIFの欄、お役に立てば嬉しいです。
denpika
denpika am 13 Jul. 2020
教えていただきありがとうございます。
GIFに保存すれば再生時間など調整できそうですが、MATLAB上でGUI的に動作をさせたい(パラメータ変更→データ観察したい)ので、実施したいこととは異なりました。
説明が不足していてすみませんでした。

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Tags

Community Treasure Hunt

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

Start Hunting!