8

SATとこの記事を実装のリファレンスとして使用して、衝突検出を実装しました。検出は期待どおりに機能していますが、両方の長方形が衝突している場所を知る必要があります。

交差点の中心が必要です その他の例

交差点の中心、上の画像の黒い点を見つける必要があります(ただし、交差点の領域もありません)。私はこれについていくつかの記事を見つけましたが、それらはすべてオーバーラップやある種の速度を回避することを含んでいます、私はこれを必要としません。

長方形について私が持っている情報は、長方形を表す4つのポイント、、、、およびupper right座標です。これらの点の交点を与えることができるアルゴリズムを見つけようとしています。upper leftlower rightlower left

その上に画像を置くだけです。2台の車が衝突したように、衝突センターの上に画像を配置しました。何か案は?

4

4 に答える 4

3

線間交叉方程式/アルゴリズムを使用して、ボックスの境界の交点を行う必要があります。

http://en.wikipedia.org/wiki/Line-line_intersection

交差するポイントができたら、それらのポイントの平均または特定の方向を指定した中心で問題ない可能性があります。質問の真ん中は少し曖昧です。

編集:これに加えて、2つの長方形のいずれかの角のいずれかがもう一方の内側にあるかどうかを調べる必要があります(これは、交差点からでも簡単に計算できるはずです)。これは、「平均」中心点を計算するときに交差点に追加する必要があります。

于 2012-10-02T21:32:06.957 に答える
3

これを行う別の方法があります。サンプリングポイントによって衝突領域の重心を見つけることです。

次の関数を作成します。

bool IsPointInsideRectangle(Rectangle r, Point p);

検索長方形を次のように定義します。

TopLeft = (MIN(x), MAX(y))
TopRight = (MAX(x), MAX(y))
LowerLeft = (MIN(x), MIN(y))
LowerRight = (MAX(x), MIN(y))

ここで、xとyは両方の長方形の座標です。

次に、メッシュのように検索領域を分割するためのステップを定義します。AVG(W、H)/ 2を使用することをお勧めします。ここで、WとHは検索領域の幅と高さです。

次に、メッシュポイントがコリジョン領域内にあるかどうかを確認するために、メッシュポイントを反復処理します。

IsPointInsideRectangle(rectangle1, point) AND IsPointInsideRectangle(rectangle2, point) 

定義:

Xi : the ith partition of the mesh in X axis.
CXi: the count of mesh points that are inside the collision area for Xi.

それで:

ここに画像の説明を入力してください

そして、あなたはもちろんYで同じことをすることができます。このアプローチの実例を次に示します。

ここに画像の説明を入力してください

于 2012-10-03T16:53:51.930 に答える
2

不規則なポリゴンには中心が定義されていないため、これは注意が必要です。ポリゴンは(長方形の場合)凸面であることが保証されているため、衝突を構成するポリゴンのコーナー(元の形状のコーナーまたはエッジの交差を含むことができます)を見つけて、それらを平均してを取得できます。 .. なにか。おそらく「中心」が期待される場所に漠然と近くなり、正多角形の場合はおそらく正確に一致しますが、数学的に何かを意味するかどうかは少し異なります。

私は数学的にいじって、次のことを考え出しました。これは、ポイントが表示されたり消えたりするときの滑らかさの問題を解決します(ヒットボックスの動きによって長方形が三角形になる、またはその逆の場合に発生する可能性があります)。この余分な部分がないと、コーナーを追加および削除すると図心がジャンプします。

ここで、このフープロットを取ります。

プロットは、RとB(赤と青の場合)の2つの長方形を示しています。交差点はエリアG(緑の場合)を一掃します。非加重中心と加重中心(両方とも紫)は、次の方法で計算されます。

(0.225, -0.45):   Average of corners of G
(0.2077, -0.473): Average of weighted corners of G

ポリゴンの重み付けされたコーナーは、コーナーの角度のsinによって重み付けされた、コーナーの座標として定義されます。

このポリゴンには、2つの90度の角度、1つは59.03度の角度、もう1つは120.96度の角度があります。(両方の非直角は同じ正弦を持ち、sin(Ɵ)= 0.8574929 .. ..

したがって、重み付けされた中心の座標は次のようになります。

( (sin(Ɵ) * (0.3 + 0.6) + 1 - 1)   / (2 + 2 * sin(Ɵ)),  // x
  (sin(Ɵ) * (1.3 - 1.6) + 0 - 1.5) / (2 + 2 * sin(Ɵ)) ) // y
= (0.2077, -0.473)

提供された例では、違いはあまり目立ちませんが、4gonが3gonにはるかに近い場合、大幅な偏差があります。

于 2012-10-02T21:29:36.180 に答える
0

領域の実際の座標を知る必要がない場合はCALayer、フレームが長方形である2つのを作成し、一方を使用してもう一方をマスクすることができます。次に、マスクされている画像に画像を設定すると、画像が重なっている領域にのみ表示されます。

于 2012-10-02T21:31:58.630 に答える