0

私は現在、衝突の可能性を検出するための広いフェーズと、衝突の決定論的解決を行うための細かいフェーズを備えた衝突検出アルゴリズムに取り組んでいます。幅広いフェーズは階層型ハッシュグリッドに基づいており、良好に機能しています。

ファインフェーズはカスタムアルゴリズムに基づいており、n体の衝突を処理しています。ただし、2体以上の衝突を正確に解決するには、すべての衝突とそれに対応する要素を衝突セットに登録する必要があります。

ファインフェーズの衝突セットを反復処理するために、ブロードフェーズ中に何らかの方法で衝突を保存するための最良の方法は何でしょうか?私は特定のデータ構造に沿って考えていましたが、まだ理想的な解決策を思い付くことができませんでした。

4

2 に答える 2

0

その論文の手法は、パフォーマンスが重要な状況に適用できるようには見えません。

シミュレーションで移動するオブジェクトは通常、反復ごとに再配置されるため、あるオブジェクトが衝突することなく別のオブジェクトの反対側に「テレポート」できるというシナリオを解決しようとしているようです。

代わりに、最後の更新以降に移動したスペースに各オブジェクトを押し出すことをお勧めします。たとえば、ボックスが上に移動すると、より背の高いボックスになります。

これにより、モーションや更新レートを考慮する必要もなく、潜在的な衝突をすばやく検出できます。潜在的な衝突は、必要に応じて精査できます。

于 2012-09-01T19:58:05.900 に答える
0

私の現在のアプローチ

この問題についてもう少し考えた後、次のアプローチを試すことにしました。

  • 衝突セットは要素のベクトルです
  • 衝突セット自体はリストに保存されます
  • すべての要素は、ハッシュマップで設定された衝突を指します

ブロード フェーズ中に衝突が検出された場合:

  1. どちらの要素もハッシュマップのキーでない場合:
    • 衝突セットの新しいベクトルが作成されます
    • 両方の要素が衝突セットに追加されます
    • 衝突セットが衝突リストに追加されます
    • 両方の要素が衝突セットのキーとしてハッシュマップに挿入されます
  2. 1 つの要素がハッシュマップのキーである場合:
    • 衝突セットはその要素を介して取得されます
    • 他の要素が衝突セットに追加されます
    • もう一方の要素は、衝突セットのキーとしてハッシュマップに挿入されます
  3. 両方の要素がハッシュマップのキーである場合:
    • 両方が同じコリジョン セットを指している場合は問題ありません。
    • それらが異なる衝突セットを指している場合
      • 新しい衝突セット ベクトルを作成する
      • 両方のコリジョン セットを新しいコリジョン セットにコピーする
      • 衝突リストから両方の衝突セットを削除します
      • 新しい衝突セットを衝突リストに追加
      • 新しいコリジョン セットを反復処理し、各要素のハッシュマップ内の参照を更新します

ファイン フェーズでは、コリジョン リスト内のすべてのコリジョン セットを単純に反復処理し、正確なコリジョン解決を行うことができます。

解決策はかなり高速ですが、メモリフットプリントが少し心配です。詳細を知るには、いくつかのベンチマークを実行する必要があります。

于 2012-09-01T21:54:42.430 に答える