09.17 BOIDSv1.00 ~整エル~

前回は位置「重心」を目標に「群れ」を構築する論理は組み込まれましたが、次は速度を平均化して同じ方向を向くように変える試みです。

この処理には少々疑問もあります。
というのもAは↑、Bは↓、Cは←、Dは→の場合平均速度は0ということになり、あまり意味がないように見えますが、例えば皆左の方向を向いて速度がバラバラに場合は有効となります。 とりあえず、プログラム化してみましょう。

/************************************************************************
* 整列(Alignment)の導入                         *
* 分離行動と同じ視野内の個体群の平均速度に合わせて行動する       *
************************************************************************/
void alignment(int index,Iwashi_str *IwashiThis)
{
  int       vCount;
  double     isAngle;
  int       isLeft;
  double     dist;
  int       n;
  Vector_str   Vec;


  vCount = 0;
  if (checkBox6->Checked == false)
  {
    mureIwashi.Vec.x = Esa.Vec.x;
    mureIwashi.Vec.y = Esa.Vec.y;
    n = 1;
  }
  else
  {
    mureIwashi.Vec.x = 0;
    mureIwashi.Vec.y = 0;
    n = 0;
  }

  for (int i = 0; i < iwashi_kazu; i++)
  {
    if (i != index)
    {
      isCrosDot(IwashiThis , &iwashi[i] , &isAngle , &isLeft);
      if (fabs(isAngle) <= _ALIGNMENT_TURN_ANGLE)
      { /* 前方内にいる場合 */
        dist = distanceTo(&iwashi[i].Pos, &IwashiThis->Pos);
        if ( dist <= (PodSize + _ALIGNMENT_VIEW_DIST))
        {
          n++;
          mureIwashi.Vec.x += iwashi[i].Vec.x;
          mureIwashi.Vec.y += iwashi[i].Vec.y;
          vCount = i+1;
        }
      }
    }
  }

  if (vCount != 0)
  {
    mureIwashi.Vec.x /= n;
    mureIwashi.Vec.y /= n;

    if ((IwashiThis->Vec.x * mureIwashi.Vec.y - IwashiThis->Vec.y * mureIwashi.Vec.x) < 0)
    {
      Vec.x = IwashiThis->Vec.x * cos_alignment + IwashiThis->Vec.y * sin_alignment;
      Vec.y = -IwashiThis->Vec.x * sin_alignment + IwashiThis->Vec.y * cos_alignment;
    }
    else
    {
      Vec.x = IwashiThis->Vec.x * cos_alignment - IwashiThis->Vec.y * sin_alignment;
      Vec.y = IwashiThis->Vec.x * sin_alignment + IwashiThis->Vec.y * cos_alignment;
    }
    IwashiThis->Vec.x = Vec.x;
    IwashiThis->Vec.y = Vec.y;
  }
}



【BOIDS MODEL V1 00 ~整エル~】




★ 結果
これでBOIDSに必要な条件は全て整いました。
1つわかったのは、いわし行動に似た動作を実行させるためには どうやらパラメータと関係があるようで色々変えてやると変化が見られます。 もうひとつ少数の論理は必ずしも「群れ」を構成した倍の論理ではないということで、非常に難しいということです。

【BOIDS MODEL V1 00 ~群ガル~】