赤い方のは右のボタンで加速・減速ができる。

これは万有引力によって運動する二つの人工衛星のシミュレーションである。プログラムを見て欲しいが、

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は「どの物体へと力を及ぼすか」を示す。このファイルには含まれていない部分で、

M.interactionForce(m1);

と、

M.interactionForce(m2);

が呼ばれているのだ、と思って欲しい。どうやっているかは次回説明する(このプログラムでは、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%加速ボタンを押して確認してみよう。何が起こったか?

 では、やはりプログラムを色々書き換えて(例えば、万有引力の法則が距離に反比例だったらどうなるか、とかフックの法則に従う力ならどうなるか、とか)遊んでみよう。