前回はBoidモデルの3つの行動規則を数式で表しました。
今回はBoidモデルのプログラミング方法についてお話ししたいと思います。
目次
プログラム言語
今回の講座では、プログラム言語はJavaScriptを使用することにします。なぜJavaScriptを使うかというと、魚の動きを簡単に可視化できるためです。
以前の講座「科学技術計算講座5-粒子法(SPH法)で流体シミュレーション」で流体の挙動を粒子で可視化しましたが、今回は同じ手法を使って魚の動きを可視化してみます。
つまり、JavaScriptの言語をベースとし、HTML、p5.jsなどを使うことにより簡単に動きのあるシミュレーションを行うことができるのです。
さらに、プログラムも多くの部分で「科学技術計算講座5」のプログラムを流用できます。この講座を一通り先に一読してみてください(粒子法の理論などは難しいのでスルーして頂いて構いません)。
JavaScript、p5.js、オブジェクト指向プログラミング、近傍粒子の探索、粒子の可視化などの項目で、一通りプログラミングの流れを把握しておくとスムーズです。プログラム自体も講座5のプログラムをほぼ流用して作っていきます。
では、早速プログラミングしていきます。もとになる「科学技術計算講座5」のプログラムは、以下の記事のソースコード(GitHubにリンク)です。
このソースコードを参照しながら解説していきます。
クラスの定義
まず、クラスの定義ですが、今回使うのはVector、Particle、Cell、Rectangleです。Kernelクラスは、粒子法のカーネル関数に関するものなので必要ありません。
Vectorクラス
Vectorクラスは、2次元ベクトルを定義するためのクラスです。今回は、単位ベクトルへ変換するメソッドとベクトルの大きさを制限するメソッドをVectorクラスに追加しておきます。
unit() {
const mag = this.magnitude();
if (mag > 0) {
this.x /= mag;
this.y /= mag;
}
}
limitMax(value) {
const mag = this.magnitude();
if (mag > value) {
this.x *= value / mag;
this.y *= value / mag;
}
}
unit()は単位ベクトルへ変換するメソッドです。
limitMax(value)は、ベクトルの大きさを引数value以上にならないように制限するメソッドです。これは後述しますが、魚の速度が大きくなりすぎないように制限するために使います。
Particleクラス
Prticleクラスは、粒子を定義するためのクラスです。今回は、粒子は魚に相当します。
class Particle {
constructor(x = 0, y = 0, vx = 0, vy = 0) {
this.position = new Vector(x, y);
this.velocity = new Vector(vx, vy);
this.force = new Vector();
this.active = true;
}
ほぼそのまま使用しますが、コンストラクターに速度(vx 、vy)を入力できるようにしておきます。
Cellクラス
Cellクラスは、空間分割法のためのクラスです。魚は自分の周りの円内にいる他の魚によって移動方向を決めます。つまり、自分の近傍の魚を探す必要があります。魚の数が多いと一匹一匹の距離を測り、近傍にいる魚を探すと計算量が多くなって非効率になるため、バケット探索と呼ばれる空間分割法により効率的に近くにいる魚を探すことにします。
詳細は以下の記事を参照してください。
Cellクラスは、粒子法のプログラムと同じです。
Rectangleクラス
Rectangleクラスは、矩形の空間を定義するためのクラスです。これも粒子法と同じです。
まとめ
今回は、Boidモデルの本講座でのプログラミング方法を説明しました。粒子法のプログラムを流用することで、効率的にプログラムを作成していきます。
次回は、Boidモデルのメインである魚の移動方向の計算部分をプログラム作成していきます。