■ movie 関数
[2006/07/13]
mc (matrix calculator) には QuickTimeMovie を作る関数がありましたが CalendarMemo に移行したとき忘れていました。同じ関数名にしようかとは思ったのですがHelpから探すとき面倒だと思い QuickTimeMovie 関連の関数は movie_ で始まる名前に統一する事にしました。以下が QuickTimeMovie 関連の関数です。
movie_create(0); ~ 動画ウインドウを開く
movie_close(0); ~ 動画ウインドウを閉じる
movie_save(fileFullPath$); ~ 作成した動画を指定パスで保存
movie_saveAs(0); ~ パネルで指定し動画を保存
movie_pasteImage(img#,time); ~ 動画に画像を挿入
movie_addImage(img#,time); ~ 動画に画像を挿入
movie_start(0); ~ 動画を再生する
movie_stop(0); ~ 動画再生を停止する
movie_setRate(rate) ~ 再生速度を指定
movie_gotoBeginning(0); ~ ポインターを動画開始位置に移動
movie_gotoEnd(0); ~ ポインターを動画の最後に移動
movie_stepBack(0); ~ ポインターを一つ戻す
movie_stepForward(0); ~ ポインターを一つ進める
movie_copy(0); ~ クリップボードへコピー
movie_cut(0); ~ 削除&クリップボードへコピー
movie_delete(0); ~ 削除
movie_paste(0); ~ クリップボードからペースト
movie_selectAll(0); ~ 動画を全て選択
【例 】
●振り子の位置をシミュレーション
振り子の位置は数値微分を解く Runge-Kutta-Gill 4次法を使います。モデルは次のようなモジュールを設定します。
module 振り子(t,y,p)
{
g = p[1,1]; l = p[1,2];
θ= y[1,1]; ω= y[1,2];
dω = -g/l*sin(θ);
dθ = ω;
return(|dθ,dω|);
}
tは時間(秒)、yは角度と角速度の微分値です。また g,l,θ,ω はそれぞれ重力加速度、振り子の長さ、垂直に対する角度、角速度です。
●シミュレーション(数値)
分割時間 h = 0.05 秒、振り子の長さを2mで計算させてみましょう。最初の振り子の角度は80度です。
h = 0.05;
g = 9.8;
l = 2.0;
n = 200;
θ= 80;
y = |θ*Pai/180,0|;
t = 0; p = |g,l|;
z = addP(t,y);
for(i=0;i<n;i++){
y = rkg_4(h,t,y,p,"振り子");
t = t+h;
z = cat(z,addP(t,y));
}
parametricLinePlot(z[#,1],z[#,2|3]*180/Pai);
.OK.
黒線が角度θで赤線が角速度です。本シミュレーションで必要なのは黒線の角 度であります。
●アニメ
ウインドウの大きさを横400、縦300ピクセルとし1ピクセルが1cmであるとしましょう。
この時、角度がθラジアンの振り子の状態は
x0 = 200;
y0 = 10;
θ = 10*Pai/180;
yy = y0 + l・cos(θ)*100;
xx = x0 + l・sin(θ)*100;
zz = |0,0,3,3,1,x0*2,y0|
|x0,y0, 0, 1, 1, 0, 0|
|xx,yy, 1, 2, 2, 0, 0|
|xx-10,yy-10,5,1,1,20,20|;
a#= draw(zz,|400,300|);
a#;
.OK.
となります。あとは角度θをこのプログラムに与えれば良い訳です。
●動画
動画を作る上で重要なのは時間です。シミュレーションでは時間間隔をhとしているので1秒間の フレーム枚数は 1/h 枚になります。これをchangeMovieFrameRate関数の引数にし動画のフレーム速度にします。あとは通常の動画作成と同じになります。
~ 例1
h = 0.05; g = 9.8; l = 2.0; n = 200;
x0 = 200;
y0 = 10;
θ = 80;
y = |θ*Pai/180,0|;
t = 0; p = |g,l|;
movie_create(0);
for(i=0;i<n;i++){
y = rkg_4(h,t,y,p,"振り子");
t = t+h;
yy = y0 + l・cos(y[1,1])*100;
xx = x0 + l・sin(y[1,1])*100;
zz = |0,0,3,3,1,x0*2,y0|
|x0,y0, 0, 1, 1, 0, 0|
|xx,yy, 1, 2, 2, 0, 0|
|xx-10,yy-10,5,1,1,20,20|;
a#= draw(zz,|400,300|);
movie_addImage(a#+0, h);
}
movie_saveAs(0);
movie_close(0);