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

軌跡を消去したいときは右のボタンを押す→


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

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(m1);

と、

M.interactionForce(m2);

が呼ばれているのだ、と思って欲しい。

 M.interactionForceを設定することで他の物体に働く力を設定すること(つまり、物理法則をプログラムすること)ができる。

M.interactioForce(to)でやっていることの説明

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%加速)は、ボタンに表示される文字列である。

 運動の様子がわかりやすいように、軌跡を表示するようにしている。それはプログラムの

m1.enableTrace();

で、これがついていると軌跡が表示される。

 軌跡がたいへんになったときのために、軌跡を消去するボタンもつけてある。

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


 人工衛星を2個にしたものが、二つの人工衛星

目次に戻る