スプライトとユーザーが生成したある種の形状との衝突を検出するにはどうすればよいですか?


9

スプライトとユーザーが生成したある種の形状との衝突を検出する方法。

例えば。画面上にいくつかのオブジェクトがあります。ユーザーは指を取り、オブジェクトの周りに円を描きます(選択ルールはスプライトの周りに円を描くことですが、塗りの形状はさまざまです)。選択したオブジェクトを検出する必要があります。

(デモ画像): 最初はhttp://i52.tinypic.com/28h0t1g.pngとして投稿されています


最後の例で青が選択され、赤が選択されない理由を説明できますか?ラインが実際にスプライトに接触する必要があるかどうかも明確にできますか?3番目の例は赤いボックスに触れていませんが、選択されていると表示されています。5番目の例は非常によく似ていますが、選択されていません。#3と#5の間で探している違いは何ですか?
Romen

回答:


2

形状が主にユーザーからの線分(または制御点を含むベジェ曲線)で描画される場合、Separating-Axis-Theoremと呼ばれるかなり広く使用されているアルゴリズムを実装できます。簡単に言えば、形状が重ならない軸(方向を表す単位ベクトル)がある場合(それらの投影された値は正の差になりません)、オブジェクトは重なりません。私はこれを以前に使用したことがあり、魅力のように機能しました。



0
  • 画面と同じサイズのバッファを作成します(またはサーフェスはあなたの形状です)。各位置には、スプライトがあるかどうかにかかわらず、ブール値が含まれています。次に、ユーザーシェイプのすべての「ピクセル」をチェックします(そのブール値をチェックすることにより)位置がスプライトかどうか。または、ブール値の代わりにIDを保存することで、そこにさらにスプライトを作成できます。しかし、これは1つのスプライトの場合でした。
  • ユーザーが作成した形状を一連の線で表すことができる場合、そのような線がスプライトと交差するかどうかを確認できます。スプライトは長方形で、ユーザーの形状は線なので、「線と長方形の交点」を探してください...

アプローチは、ビットマップかベクターかに関係なく、選択したデータ構造によって異なります。

最初のアプローチは、任意の複雑な形状を処理でき、実装は簡単ですが、より多くのメモリを使用します。実際には、圧縮を使用してメモリのオーバーヘッドを削減し、階層的なデータ構造(octrees)を使用してスピードを上げることができます...

2番目のアプローチは、実装がそれほど簡単ではありませんが、より多くの処理能力を使用します。

いずれの場合も、問題があるかどうかを測定します。実装するのが簡単なので、私は最初のものをしようと思います。幸運を。:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.