MATLAB を使用してサーフェスの座標が時間とともに変化する場合 (楕円体など)、サーフェスをアニメーション化するにはどうすればよいですか?
4 に答える
MATLAB でプロットをアニメーション化する方法の例をいくつか示します...
for ループでプロットを変更します。
サーフェス座標を変更するループを作成し、 コマンドを使用してプロット オブジェクトを更新し、set
コマンドを使用してpause
各ループの反復を短時間一時停止できます。次に例を示します。
[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1); % Make an ellipsoid shape
hMesh = mesh(x, y, z); % Plot the shape as a mesh
axis equal % Change the axis scaling
for longAxis = 4:-0.1:1
[x, y, z] = ellipsoid(0, 0, 0, longAxis, 1, 1); % Make a new ellipsoid
set(hMesh, 'XData', x, 'YData', y, 'ZData', z); % Update the mesh data
pause(0.25); % Pause for 1/4 second
end
上記を実行すると、楕円体の長軸が球になるまで縮小するのがわかります。
タイマーを使用してプロットを変更します。
ループの代わりにタイマー オブジェクトを使用して、プロットの更新を実行することもできます。この例では、最初にtimer_fcn
、タイマーが起動するたびに実行する関数を作成します。
function timer_fcn(obj,event,hMesh)
n = get(obj, 'TasksExecuted'); % The number of times the
% timer has fired already
[x, y, z] = ellipsoid(0, 0, 0, 4-(3*n/40), 1, 1); % Make a new ellipsoid
set(hMesh, 'XData', x, 'YData', y, 'ZData', z); % Update the mesh data
drawnow; % Force the display to update
end
これで、プロットとタイマーを作成し、次のようにタイマーを開始できます。
[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1); % Make an ellipsoid shape
hMesh = mesh(x, y, z); % Plot the shape as a mesh
axis equal % Change the axis scaling
animationTimer = timer('ExecutionMode', 'fixedRate', ... % Fire at a fixed rate
'Period', 0.25, ... % every 0.25 seconds
'TasksToExecute', 40, ... % for 40 times and
'TimerFcn', {@timer_fcn, hMesh}); % run this function
start(animationTimer); % Start timer, which runs on its own until it ends
これにより、for ループの例と同じアニメーションが表示されます。そして、timer オブジェクトを使い終わったら、忘れずに削除してください。
delete(animationTimer);
アニメーションを画面に表示しますか、それともビデオ ファイルとして保存しますか? アニメーションを画面に表示したい場合は、gnovice がポップアップした回答にあるように、プロットしているプロットを一時停止してプログラムに繰り返し再描画させることができます。
再生用にファイルに保存する場合は、movie
関数 (チュートリアルはこちら) と、MATLAB ファイル交換のヘルパーmpgwriteツールを参照することをお勧めします。
アニメーションを簡単に作成する方法が必要な場合は、ファイル交換のANYMATEをご覧ください。ファイルのヘルプと例を参照して、図でアニメーションを実行する方法やアニメーション GIF を作成する方法を確認してください。
今週のファイル交換ピックで、 anymate のレビューをご覧ください
編集
@gnoviceの例の楕円体を anymate でアニメーション化する方法は次のとおりです。
%# create an sphere
[xs,ys,zs] = sphere; %# default is center at 0, radius 1
%# create an ellipsoid
[xe,ye,ze] = ellipsoid(0,0,0,4,1,1);
%# use anymate to interpolate between the two
anymate(@surf,{cat(3,xe,xs) cat(3,ye,ys) cat(3,ze,zs)});
%# color the surface
colormap(jet);
%# fix axes
axis equal
図には、'movie' ツールバーがあり、'play' を押してアニメーションを見ることができます。または、ファイルに保存することもできます。
上記の2つの実装の概要を説明したかった小さな違い:
1) 一時停止():
pause() は、データの少ない単純なアニメーションに使用できます。シンプルで簡単なので、私の好みの方法です。ただし、pause() は指定された時間だけ処理をブロックするため、アニメーションにほとんどデータが必要ない場合にのみ一時停止を使用します。
2) タイマー: スペクトログラムやスペクトルをアニメーション化し、「リアルタイム」で計算したり、オーディオと同期させたりしたい場合は、通常、その間の処理をブロックしないタイマー オブジェクトを使用します。このようなアニメーションで pause() を使用すると、オーディオとアニメーションの間の同期がすぐに失われます...