赤い方の●は右のボタンで加速・減速ができる。
軌跡を消去したいときは右のボタンを押す→
これは万有引力によって運動する人工衛星のシミュレーションである。プログラムを見て欲しいが、
m1=new DynamicalObject(gs,-2,0,0,0.707106781186548,1,"rgba(255,0,0,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 new Force(r.quot(-(rlen*rlen*rlen))); } else { return new Force(r.prod(-8)); } }
で、「Mから他の物体へ働く力」を設定している。このinteractionForceという関数は、toという引数を持って、Phystem(系)から呼ばれる。toは「どの物体へと力を及ぼすか」を示す。このファイルには含まれていない部分で、
と、
が呼ばれているのだ、と思って欲しい。
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から他に働く力」を設定した後で系をスタートさせると、ちゃんとその力に従った運動をしてくれるのである。
このファイルではボタンを2個用意して、ボタンを押すと物体の運動が変わるようにしてある。
<button onClick="m1.v.mul(1.1);">10%加速</button> <button onClick="m1.v.mul(0.9);">10%減速</button>
がその部分で、これによりボタンを作る。 onClick="m1.v.mul(1.1);"が「ボタンがクリックされたらこの動作を行え」という部分で、今はm1.v(つまりm1の速度)を1.1倍(または0.9倍)にするという動作を行わせている。
<button>と</button>の間にある文字列(10%加速)は、ボタンに表示される文字列である。
運動の様子がわかりやすいように、軌跡を表示するようにしている。それはプログラムの
で、これがついていると軌跡が表示される。
軌跡がたいへんになったときのために、軌跡を消去するボタンもつけてある。
では、やはりプログラムを色々書き換えて(例えば、万有引力の法則が距離に反比例だったらどうなるか、とかフックの法則に従う力ならどうなるか、とか)遊んでみよう。
人工衛星を2個にしたものが、二つの人工衛星。