すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

octave でアニメーション

こんにちは。

octave でアニメーションしたい機会があったのでやってみました。

点がだんだん増えていく場合

基本的には、次のようにfor文を使えばアニメーションになります。
linspace(-4,4,500) というのは、-4から4までの範囲を500個に区切った行列を下さい、ということです。

x=linspace(-4,4,500)

for i=1:500
	plot(x(1,i),sin(x(1,i)),"or","MarkerSize",5)
	hold on
        xlim([-4 4])
	ylim([-1 1])
	refresh
endfor

hold on で現在の描画情報を保持し、refresh で再描画しています。
また、refresh の前に軸の範囲指定を行っておかないと、点の位置ごとに軸が変化してめちゃくちゃ見辛くなります。
マーカーの色や大きさの設定については、MATLABドキュメンテーションがわかりやすいです。
jp.mathworks.com

実行結果

f:id:sweetgohan:20181022122332g:plain
(gif で保存するために、点の数を50個に減らしています)

点が動いていく場合 (+ 動かない線も描く)

先ほどのは軌跡を描いていく感じでしたが、それだと見辛い場合もあります。
例えば、同じ場所を何回か往復するような点の動きの場合、軌跡が描かれていると何がなんだかわかりません。
これは簡単で、hold on をしなければ前に描画された情報は保持されないため、軌跡は描かれません。
この hold を上手く使うと、点は動くけど線は動かない、みたいなものが作れます。

p=csvread("result.csv")

r = 10;
xc1 = 0;
xc2 = 20;
yc = 10;
x = linspace(0,20)

theta1 = linspace(pi/2,3*pi/2);
theta2 = linspace(-pi/2,pi/2);
x1 = r*cos(theta1) + xc1;
x2 = r*cos(theta2) + xc2;
y1 = r*sin(theta1) + yc;
y2 = r*sin(theta2) + yc;

for i=1:500
	plot(x1,y1,"b",x2,y2,"b",x,20,"-bo","MarkerSize",1,x,0,"-bo","MarkerSize",1)
	hold on
	plot(p(i,1),p(i,2),"or","MarkerSize",3)
	hold off
	xlim([-15 35])
	axis equal //円が丸くなる
	refresh
endfor

つまり、初めに動かない線を描いて点を書き、それを消してまた動かない線を書き・・・とやっているわけです。
plot(x1,y1,x2,y2,...) としていくことで同時に描画することができます。
以前計算したデータをプロットしてみました。
kabos.hatenablog.jp

実行結果

gif が重かったので動画にしました。

点が複数の場合

点が複数ある場合も、forの中で複数同時描画するだけです。

p=csvread("result2.csv")

r = 3;
xc = 0;
yc = 0;

theta = linspace(0,2*pi);
x = r*cos(theta) + xc;
y = r*sin(theta) + yc;

for i=1:200
	plot(x,y)
	hold on
	plot(p(i,2),p(i,3),"or","MarkerSize",17,p(i,4),p(i,5),"og","MarkerSize",17)
	hold off
	xlim([-3 3])
	ylim([-3 3])
	axis equal
	refresh
endfor
実行結果


アニメーションを gif で保存する方法

for文の中に、
> print animation.pdf -append
と入れます。これはワンフレームごとにpdfファイルとして保存させています。
その後、for文の外に
> im = imread ("animation.pdf", "Index", "all")
> imwrite (im, "animation.gif", "DelayTime", .5)
と入れます。これでgifとして保存できます。(が、めちゃくちゃ重いです・・・)

動くと楽しいですね。

MATLABとOctaveによる科学技術計算

MATLABとOctaveによる科学技術計算