前書き
Boidsアルゴリズムは、グループ内の緊急行動の比較的簡単なデモです。作成者のクレイグ・レイノルズが説明するように、3つの主要なルールがあります。
基本的な植毛モデルは、個々のボイドが近くの植生仲間の位置と速度に基づいてどのように操作するかを記述する3つの単純なステアリング動作で構成されます。
- 分離:地元の群れが混雑しないように操縦します。
- アライメント:地元の群れの平均的な方向に向かってください。
- 結束:地元の群れ仲間の平均的な位置に向かって移動するように操縦します。
各boidは、シーン全体の幾何学的記述に直接アクセスできますが、群れを作るには、周囲の特定の小さな近傍内の群れだけに反応する必要があります。近傍は、ボイドの中心から測定された距離とボイドの飛行方向から測定された角度によって特徴付けられます。この近隣地域の外の群れは無視されます。近隣は、限られた知覚のモデルと考えることができます(濁った水中の魚など)が、群れ仲間がボイドのステアリングに影響を与える領域を定義するものと考える方がおそらく正しいでしょう。
私は物事を説明するときに完璧ではないので、ソースをチェックアウトすることを強くお勧めします。また、彼のサイトには非常に有益な写真がいくつかあります。
チャレンジ
ボイド(シミュレートされたエンティティ)の数とフレームの数を指定して、シミュレーションのアニメーションを出力します。
- ボイドは赤い円としてレンダリングされる必要があり、円の内側の線はヘディングを示します。これは、ボイドが指している方向です。
- 各ボイドの角度(レイノルズによる説明)は、完全な300度である必要があります。(360ではない)
- 各boidの開始見出しと位置は、位置と同様に、ランダムに(ただし、シードされているため、出力はまだ確定されている)必要があります。
- ボイドの半径が1の場合、近傍の半径は3でなければなりません。
- boidの数は2〜20の範囲です。
- フレームの数は1〜5000のいずれかになります
- アニメーションは、フレームごとに最小10ミリ秒、最大1秒でボイドの数で再生する必要があります。(2ボイド=フレームあたり最大2秒、3ボイド=フレームあたり最大3秒など)
- 出力アニメーションは、少なくとも5ボイド半径x 5ボイド半径、半分のボイド数の倍数である必要があります。したがって、2ボイドの最小サイズは10ボイド半径x 10ボイド半径であり、3ボイドの最小サイズは15ボイド半径x 15ボイド半径などです。
- 各boidの半径は、最小で5ピクセル、最大で50ピクセルでなければなりません。
- 各boidの速度は、1フレームで半径の1/5を超えて移動しないように制限する必要があります。
- 出力は確定的である必要があるため、同じ入力が複数回実行された場合に同じ出力を生成します。
- ボイドが境界に達すると、反対側に戻ります。同様に、各boidの周囲も境界を囲む必要があります。
アルゴリズムの規則
この場合、各Boidの周囲には、Boidの見出しを中心とした300度に及ぶセクターがあります。この「近傍」の他のboidは、「近傍」、または(レイノルズの用語を使用すると)「群れ」と見なされます。
各ボイドは、衝突を回避し、1つのボイド半径と隣接するボイドの快適な距離を維持するために、見出しを調整する必要があります。(これはアルゴリズムの「分離」の側面です。1つの半径をバイパスすることもできますが、ゴムバンドのように、元の位置に戻ります。)
各ボイドは、最初のルールに干渉しない限り、さらに他のボイドの平均ヘディングに近づくように、ヘディングを調整する必要があります。(これはアルゴリズムの「アライメント」の側面です)
衝突が発生しないか、2番目のルールを大幅に妨害しない限り、各ボイドは群れの平均位置に向かって回転します。
この件に関する彼の論文で、彼はこれを次のように説明しています。
シミュレートされた群れを構築するには、幾何学的飛行をサポートするボイドモデルから始めます。衝突回避の反対の力と群れに参加する衝動に対応する行動を追加します。ルールとして簡単に述べますが、優先順位の高い順に、群れのシミュレーションにつながる動作は次のとおりです。
- 衝突回避:近くの群れとの衝突を回避
- 速度マッチング:速度を近くの群れと一致させようとします
- 群れの中心化:近くの群れの近くにとどまることを試みる
動きのより詳細な説明:
- Boidsアルゴリズムの標準実装では、通常、各ルールの計算を行い、それを一緒にマージします。
- 最初のルールでは、boidは近傍内の隣接boidのリストを通過し、それ自体と近傍との距離が特定の値よりも小さい場合、boidを隣接から遠ざけるベクトルがboidの見出しに適用されます。
- 2番目のルールでは、ボイドはその隣の平均ヘディングを計算し、現在のヘディングと平均ヘディングの差のわずかな部分(このチャレンジでは1/10を使用します)を現在のヘディングに追加します。
- 3番目の最後のルールでは、boidはその近傍の位置を平均し、この位置を指すベクトルを計算します。このベクトルは、ルール2に使用されたものよりもさらに小さい数で乗算され(このチャレンジでは、1/50が使用されます)、見出しに適用されます。
- 次に、ボイドは見出しの方向に移動します
ここ Boidsアルゴリズムの有用な擬似コードの実装があります。
入力と出力の例
入力:出力:5、190(5ボイド、190フレーム)
勝利基準
これはcode-golfであるため、バイト単位の最小のソリューションが優先されます。