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
実行結果
(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
点が複数の場合
点が複数ある場合も、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として保存できます。(が、めちゃくちゃ重いです・・・)
動くと楽しいですね。
- 作者: 加古孝,千葉文浩
- 出版社/メーカー: 丸善出版
- 発売日: 2014/12/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る