ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その3:「boids理論」ぶつからないようによける。
boidデモ作成 その3:「boids理論」ぶつからないようによける。
フラッシュで、「boids」デモを作ってみよう。第3回。

点がランダムな方向に動くようになった前回からの続き。コードも変更点しか示さないので、前回分を良くチェック。
このままではツマラナイので、動きに変化、というか工夫を加えたいよね?というお話。の続き。



各個体どうしの距離

さて、boid理論では、各個体(今回の記事では点)の距離が「近いか、遠いか」判らなければならない。
これは点毎の総当りとなる。点が100あれば、およそ5000回の距離の計算をする事になる。


//  各点の距離を保存する配列
private var distance:Array  =   new Array(number_of_points*number_of_points);
//  各点の距離を計算する
private function calcDistance():void 
{
    for (var a:int = 0; a < number_of_points; a++)
    {
        var ta:one  =   objs[a]
        var tap:Point   =   ta.p;
        for (var b:int = a + 1; b < number_of_points; b++)
        {
            var tb:one  =   objs[b];
            var d:Number    =   tap.subtract(tb.p).length;
            distance[a + b * number_of_points]  =   d;
            distance[a * number_of_points + b]  =   d;
        }
    }
}
ある点Aから点Bまでの距離を求めれば、点Bから点Aの距離も同じなので、個体数の二乗の半分が目安となる。
個体数が少ないときは、このような計算の最適化は必要ないが、今回のように、点の数の物量で動きを視覚的に訴える場合、計算の最適化は必須である。


ぶつからないようによける

以下のコードを、「vの方向に進み端跳ね返る」の前に追加する。

//  距離が近すぎるものから逃げる
var b:int   =   i * number_of_points;
var ap:Point    =   new Point();    //  逃げる加速度
var ac:int  =   0;                  //  後で平均値を取る為のカウンター
for (var j:int = 0; j < number_of_points; j++)
{
    var dis:Number  =   distance[b + j];
    if (    i!=j    &&   dis< 10    )   //  距離が10以下
    {
        var tb:one  =   objs[j];
        var d:Point =   new Point(t.p.x -   tb.p.x, t.p.y   -   tb.p.y);
        d.normalize(1.0);
        ap.x    +=  d.x;
        ap.y    +=  d.y;
        ac++;
    }
}
if (    ac  )
{
    t.v.x   +=  ap.x / ac;
    t.v.y   +=  ap.y / ac;
}
Get Adobe Flash player

「距離が近すぎるものから逃げる」を追加。見ると判るが、直ぐに発散を始め、箱の中で暴れだす。

これは、各個体の移動速度に制限が無く、その他の減速の仕組みが無い為で、加速をできても減速できない為にこうなる。


速度に制限をつけて見よう。以下のコードを、「vの方向に進み端跳ね返る」の前、前述のコードとの間に追加する。

//  速度の上限を3にする
if (    t.v.length > 3  )   t.v.normalize(3);
Get Adobe Flash player

まさに、微生物。田舎のチョっと生臭い田んぼの用水路なんかの水を顕微鏡で観察したような絵になった。

しかし、これでは一部の方に「気持ち悪い」と言われかねない。それぞれが雑多に動き回っているだけだからである。

この「微生物チックだから」というのも、逆に微生物がそれだけ単純な理屈で動いているから、この段階でも「リアルな微生物」の再現が出来ているとも言えるのだが(笑)。


>> その4へ。

トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/188

コメントする

ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その3:「boids理論」ぶつからないようによける。