javascriptによる物理シミュレーション:はじめに


上に貼り付けたのは分子運動のシミュレーションで、分子どうしが力を及ぼし合いつつ動いている。見ていると近づくと斥力が働いて運動量を交換しつつまた離れていく様子が見える。

「さぞかしすごいプログラムをしているのだろう」と思うかもしれないが、実は「このプログラム」の為だけに書いた部分は↓だけである。


	 var ps;
	 var Molecule=function (ps,x,y,vx,vy,m,c) {
	   DynamicalObject.call(this,ps,x,y,vx,vy,m,c);
	 };
	 Molecule.prototype=Object.create(DynamicalObject.prototype);
	 Molecule.prototype.constructor=Molecule;
	 Molecule.prototype.interactionForce=function (m2) {
	   var r=m2.npos.diff(this.npos);
	   var rlen=r.length();
	   return r.prod(10*Math.exp(-2*rlen*rlen));
	 };
	 function initBunsi(n) {
	   var j;
	   ps.cleardyLists();
	   var w1=ps.w-3;
	   var h1=ps.h-3;
	   var maxv=1;
	   for (j=0; j < n ; j++) {
		 var m=new Molecule(ps,w1*Math.random()-w1*0.5,	h1*Math.random()-h1*0.5,2*maxv*Math.random()-maxv,2*maxv*Math.random()-maxv,0.5,"rgba(0,0,0,0.8)");
	   }
	 }
	 function init(canvas_string) {
	   ps=new Phystem(canvas_string,20,20,0.5);
	   ps.makeEdge();
	   initBunsi(100);
	   ps.start();
	 }

 もちろん、プログラム全体はこれで終わりではないが、残りの部分は「このプログラム」の為だけに書いた部分ではなく、いろんなプログラムで共有できる部分なのである。この共有部分は、ファイルの最初の方の

		<script src="rescalecanvas.js"></script>
		<script src="vector.js"></script>
		<script src="yajirushi.js"></script>
		<script src="phystem.js"></script>

で読み込むようになっている。


 この授業の目標は、

ということである。


 一回めである今回は、いくつかのサンプルプログラムを動かし、それを少しだけ改変してまた動かして、ということをして、作り方のイメージを見せていこう。

作業に入る前に、もらったファイルのディレクトリ全部を別のところに(名前は「保存用」などをつけて)保存しておくことを勧める。この後配布したファイル自体を編集しながら授業を進めていく。

 この授業は4週計画だが、まず第1回では以下のプログラムをいじって遊び、物理シミュレーションのだいたいの雰囲気を知ってもらう。

第1回で遊ぶ、サンプルプログラム


なお、第1回の授業で配布したプログラムをローカルファイルとして欲しい人は、以下のzipファイルをダウンロードし解凍すればよい。→lec1.zip


 第2回ではプログラムの中身(主に、オブジェクト指向のプログラミングとはどういうもので、ここで使っているサンプルプログラムではどのようにそれが実現されているか、ということ)について講義し、さらにサンプルプログラムをいじって遊ぶ。

 第3回と第4回前半までに、各自独創的な物理シミュレーションを作成し、USBメモリで持参、もしくは前野までメールすることで提出して欲しい。提出したプログラムで成績評価を行う。

 第4回後半で、優秀作のプレゼンテーション(実際に動くところをみんなに見せる)を行う。


 作って欲しいのは、なんらかの「遊べる」「見ていて楽しい」「勉強になる」物理シミュレーション。プログラムできるのは質点系のみでしかも2次元運動しかできないが、いろいろおもしろいものが作れるのではないかと思う。たとえば、

などなど、諸君の自由な発想による作品を期待している。


 優秀作は、この講義のwebページで(世界に向けて!)公表する。

 公表してほしくない人、公表してもいいけど自分の名前は出さないで欲しい人(匿名希望、もしくは本名でなくハンドルネーム希望)は提出の時にその旨申し出ること。