0

これは技術的な質問というよりはプログラミングの問題ですが、プログラミングと数学に関連しているので、役立つフィードバックをもらいたいと思っています。

2つの長方形があります:rectangle1rectangle2

どちらも4つのfloat値によって定義されます。

float left;
float right;
float top;
float bottom;

この例では、各長方形が100 x 100であり、rectangle1が次のようになっているとします。

float left = 100.0;
float right = 200.0;
float top = 500.0;
float bottom = 600.0;

そしてrectangle2は:

float left = 150.0;
float right = 250.0;
float top = 550.0;
float bottom = 650.0;

衝突が発生したとき、8つのfloat値を使用して、rectangle1のどちら側がrectangle2のどちら側に当たるかを判別しようとしています。

私の質問に答えた場合、衝突が発生したときに次のようなものを判断できる可能性があります。

長方形1の右側が長方形2の左側に当たる

これまで、私は簡単な数学を使用して、各可能性の間の距離を決定しようとしました。

float distance1 = rectangle2.left - rectangle1.right;
float distance2 = rectangle2.top - rectangle1.bottom;
float distance3 = rectangle2.right - rectangle1.left;
float distance4 = rectangle2.bottom - rectangle1.top;

次に、これらの値の最小値を使用して、各長方形のどちら側が衝突に関与しているかを判断します。しかし、それはそれほど単純ではないようです。この試みには2つの基本的な問題がありました。

1)衝突コードに到達するまでに、長方形はすでに重なり合っています。

2)複数の長方形が積み重なっている場合、計算によって奇妙な結果が生成されます(つまり、rectangle1が右上方向に移動していて、左側の両方の長方形に当たる場合でも、実際には1つの長方形に当たる可能性があります。下と左側にあります。)

(これは、衝突コードに到達したときに長方形が重なっていて、この場合、distance1とdistance4が近いか等しいためです。)

簡単な数学を使ってこの質問に答えるより良い方法はありますか?どんな助けでもいただければ幸いです。

そして、それが言及される前に、これは宿題ではなく、私が私のゲームのために解決しようとしている本当の問題です。

4

1 に答える 1

1

衝突を正しく識別できる場合は、面を決定するために、2 つの長方形の中心を結ぶ線を引き、各長方形の面との交差を確認します。2 つの長方形が重なっていない限り、または正確には、一方の中心がもう一方の内側にない限り、線はいつでも 2 つの面と交差します。

それらが重なっている場合、1 または 0 の交差を取得できます。ケース 0: 1 つの長方形が完全に他の長方形の内側にあるため、どの辺がヒットしているかをどのように決定するかを決定できます。各中心に最も近いものを選択することもできます。

ケース 1: 長方形が全体的または部分的に他の長方形の内側にある。いずれの場合も、外側の (含む) 長方形を横切るまで、中心を結ぶ線を延長し続けます。含まれている長方形をもう一度横切る場合は、ヒット面を新しく交差した面に変更するだけです。

あまり混乱しないことを願っています:)

于 2013-01-10T00:30:42.427 に答える