はじめに
先日、授業の課題でMathematicaのGraphics機能を使って絵を描く、という課題が出たので、アニメーションを作りました。
その備忘録です。
Mathematicaでのアニメーション作成
まず、Mathematicaでアニメーションを作るにはDoループ、Animate、DynamicModuleなどの方法があります。
私が作ろうとしていたアニメーションは、一般的なアニメーションの作成方法と同様に、1秒間に何度か図形を切り替えてアニメーションにしようとしていたため、より高度な扱いができるDynamicModuleを採用しました。
Animateうまく動かせなかった
DynamicModuleによるアニメーションのコード
DynamicModule[{i = 1},
Circles = {Circle[{0, 2}, 1], Circle[{1, 1.75}, 1],
Circle[{2, 1.5}, 1]};
ground = Line[{{-2, -2}, {2, -2}}];
Dynamic[
Graphics[{ground, Circles[[i]]}, PlotRange -> {{-6, 6}, {-6, 6}}]],
Initialization :> (RunScheduledTask[If[i < 3, i++, i = 1], 0.5])]
動かすとこんな感じになります。
コードの中身を見ていきます。
DynamicModule[{i = 1},
ここではDynamicModuleを利用し、最初に変数iに1を代入しています。
iは配列のi番目の要素を出力する時に使うのですが、最初に1つ目の要素を出力するために1を代入しています。ちなみに、Mathematicaは1-index(配列のn番目の数え方が0ではなく1から始まる)なので、0を入れると何も出力されません。
Circles = {Circle[{0, 2}, 1], Circle[{1, 1.75}, 1],
Circle[{2, 1.5}, 1]};
ground = Line[{{-2, -2}, {2, -2}}];
出力する図形です。
円はアニメーションとして動かしているので、Circlesは配列になっています。
地面の線は固定されているので、配列ではなくLineだけになっています。
Dynamic[
Graphics[{ground, Circles[[i]]}, PlotRange -> {{-6, 6}, {-6, 6}}]],
DynamicModuleで動かすGraphicsの変数がまとまっています。
groundとCirclesのi番目をGraphicsで表示、Graphicsの描画範囲をPlotRangeで指定しています。
Initialization :> (RunScheduledTask[If[i < 3, i++, i = 1], 0.5])]
If[i < 3, i++, i = 1]
の部分で、iが[1, 2, 3]の値を取ることを、0.5
の部分で0.5秒ごとに画像を更新することを指定しています。
補足
ちなみに、アニメーションの出力はExport関数を使うとgif形式で出力できます。