赤い方の●は右のボタンで加速・減速ができる。
これは万有引力によって運動する二つの人工衛星のシミュレーションである。プログラムを見て欲しいが、
m1=new DynamicalObject(gs,-2,0,0,0.707106781186548,1,"rgba(255,0,0,0.5)");
と、
m2=new DynamicalObject(gs,0,2,0.707106781186548,0,1,"rgba(0,0,255,0.5)");
で動く二つの物体を設定し、
M=new NonDynamicalObject(gs,0,0,"rgba(0,200,0,0.8)");
で動かない物体(地球)を設定している。これだけでは力が働かないから、
M.interactionForce=function (to) { var r=to.npos; var rlen=r.length(); if (rlen > 0.5) { return r.quot(-(rlen*rlen*rlen)); } else { return r.prod(-8); } }
で、「Mから他の物体へ働く力」を設定している。このinteractionForceという関数は、toという引数を持って、Phystem(系)から呼ばれる。toは「どの物体へと力を及ぼすか」を示す。このファイルには含まれていない部分で、
と、
が呼ばれているのだ、と思って欲しい。どうやっているかは次回説明する(このプログラムでは、m1とm2の間の万有引力は取り入れていないことに注意)。
M.interactionForceを設定することで他の物体に働く力を計算することができる。
詳しい説明は後でじっくり行うことにするが、
var r=to.nposは「力を及ぼす物体(to)の現在よりちょっと後の位置(npos)をrという変数に入れている。
var rlen=r.length();の部分で、rの長さを計算する。万有引力は距離の自乗に反比例だから、r.quot(-(rlen*rlen*rlen));で、「長さの三乗(rlen*rlen*rlen)」で割る(quot)ことで距離の自乗に反比例するようにする(rそのものが距離に比例していることに注意)。さらにマイナス符号をつけることで引力にする。
ただしこれだとrlen=0に近づくと万有引力が無限大になっていくので、rlenが0.5より小さい時は力を r.prod(-8);に変えている。r.prod(-8)はrの(-8)倍である。rlenが0.5の時にこの二つ、(-8)と1/(rlen*rlen*rlen)は一致する。
こうして、「Mから他に働く力」を設定した後で系をスタートさせると、ちゃんとその力に従った運動をしてくれるのである。
最初の段階では赤が青を(90度遅れて)追いかけている。この時赤が青に追いつくようにするにはどうすればいいだろう??
そりゃ、加速すればいいだろう、と思うかもしれないが、実はそうではないということを実際10%加速ボタンを押して確認してみよう。何が起こったか?
では、やはりプログラムを色々書き換えて(例えば、万有引力の法則が距離に反比例だったらどうなるか、とかフックの法則に従う力ならどうなるか、とか)遊んでみよう。