TOTOのサイトの水面の断面図を再現しようと色々しらべて、ActionScript 3.0で実験していますが、なかなかうまくいきません。
どうやら波動方程式を応用するようで、とりあえず公式をActionScript 3.0にしてみました。
2次元波動方程式の数値計算例(C言語)
http://www.geocities.jp/supermisosan/secondwaveequation.html
しかし、式のどの部分をいじれば改良できるのか。まだまだ検討中です。
var N:int=100;
var tmax:int=3;
var c:Number=1;
var dt:Number=1;
var dx:Number=1.5;
var t:int=0;
var i:int;
var j:int;
//ステージを画面に100%表示
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
//二次元配列の作成
//二次元配列(二次元目
var subYs:Array = new Array();
for (j = 0; j < N; j++) {
subYs.push(0);
}
//二次元配列(一次元目
var Ys:Array = new Array();
for (i=0; i<tmax; i++) {
Ys.push(subYs);
}
var sps:Array = new Array();
for (i=0; i<N; i++) {
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xff0000);
sp.graphics.drawCircle(0,0,2);
addChild(sp);
sps.push(sp);
}
//波の初期条件の決定
for (i=0; i<N; i++) {
if (30<i&&i<70) {
Ys[0][i]=-150;
} else {
Ys[0][i]=0;
}
//trace(Ys);//fprint
graphics.beginFill(0x000000);
graphics.drawCircle(i*5, Ys[0][i]+stage.stageHeight*1/4,2);
}
//マウスダウンのときに再初期化
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMD);
function onMD(e:MouseEvent):void {
t = 0;
for (i=0; i<N; i++) {
if (0<i&&i<100) {
Ys[0][i]=-550;
} else {
Ys[0][i]=0;
}
//graphics.beginFill(0x00ff00);
//graphics.drawCircle(Math.random()*stage.stageWidth,Math.random()*stage.stageHeight,10);//fprint
}
}
//n
//初期状態から次の状態を計算する
addEventListener(Event.ENTER_FRAME, onEF);
function onEF(e:Event):void {
t++;
if (t==1) {
for (i=1; i<N; i++) {
Ys[1][i]=Ys[0][i]+c*c/2*dt*dt/(dx*dx)*(Ys[0][i+1]+Ys[0][i-1]-2*Ys[0][i]);
}
Ys[1][0]=Ys[1][N-1]=0;//境界条件
for (i=0; i<N; i++) {
//trace(Ys);//fprintf
graphics.beginFill(0x000000);
graphics.drawCircle(i*5, Ys[1][i]+stage.stageHeight*2/4,2);
}
} else if (t>=2) {
//以降の波の状態を計算する
for (i=1; i<N; i++) {
Ys[2][i]=2*Ys[1][i]-Ys[0][i]+c*c*dt*dt/(dx*dx)*(Ys[1][i+1]+Ys[1][i-1]-2*Ys[1][i]);
}
Ys[2][0]=Ys[2][N-1]=0;
for (i=0; i<N; i++) {
//trace(Ys);//fprintf
sps[i].x = i*5,
sps[i].y = Ys[0][i]+stage.stageHeight*3/4;
}
//n
for (i=0; i<N; i++) {
Ys[0][i]=Ys[1][i];
Ys[1][i]=Ys[2][i];
}
}
}







関連する記事