以下は、衝突現象のシミュレーションである。
左の球の速度: 右の球の速度:
相対速度比:
二つの球を考えているが、その二つの球の間に働く力(interactionForce)を
Ball.prototype.interactionForce=function (to) { var r=to.npos.diff(this.npos); var rlen=r.length(); if (rlen > 2*this.r) { return new Vector(0,0); } else { return r.prod(10000*(2*this.r-rlen)*(2*this.r-rlen)); } };
のように定義して作っている(離れていると何も力が働かず、近づくと反発力)。
衝突によりはね返り係数がどうなるかを調べるようになっている。
コードの中にある、ps.report=で始まる部分が、psのreport()というプロパティ(関数)を書きなおしていて、この部分で現在の二つの球の速度と、その相対速度の比(初速度に比べて)を出すようになっている。
相対速度の比は要ははね返り係数である。今、エネルギーが保存するような計算になっているはずだから、1になるはず(実際にやってみると、有効数字3桁程度の範囲で1になっている)。
こんなふうに何度も繰り返すシミュレーションでは、(いちいちソースを書き換えるのはたいへんだし)ボタンを使って命令したり、スライダを使って数値を変更したりできると楽である(↑でも、そうしている)。その方法について以下で述べる。
htmlの中(ボタンを置きたい部分)に<button onclick="restart();">やり直し</button>と書いておくと「やり直し」と書かれたボタンがブラウザ上に現れる。押すと、onclickのところに書かれた関数が実行される(この場合、restart())。restartという関数の中身はソースを見よう。
スライダを使う場合はhtmlの最初の方でvarslider.jsを読み込んでおくこと。
スライダはプログラムで生成させている。生成するためのコードは
var a=new VarSlider("v0",0.1,5,1,0.1,function(x) { nextv0=x;},"初速度");
という部分(VarSliderというクラスがvarslider.jsの中で定義されている)。引数の意味はvarslider.jsの方を見て欲しいが、大事な点はこのスライダの中身が変更されるとfunction(x) { nextv0=x;}の部分が実行されるということ。そのときxにはスライダーにセットされた値が入っている。この場合、nextv0という変数の値をスライダの示す値に変更しているのである。