質問: C#です。 長方形と長方形の衝突判定で、 片方が動く長方形A、もう片方は移動しない長方形Bです。長方形Aと長方形Bがぶつかった時に、 長方形Bの4辺のうち、どの辺に衝突するのかを判定する方法を教えてください。
回答: 長方形AとBは、辺の長さが0ではなく、添付図の左側のような位置関係にあったとします。 問題に「ぶつかった時に」や「どの辺に衝突するのか」とあるので、2つの長方形の考えるべき位置関係は次の2パターンです。 パターン1.Aの頂点がBの辺に重なる (添付図の左や中央) パターン2.Aの辺の端の一部が、Bの辺の一部と重なり、Aの頂点がBの辺に重なる (添付図の右端の上段) 2つの長方形が「交差する」場合や、添付図の右端の中段や下段のように、「Aの頂点がBの辺ではなく端点に衝突」する場合は考えません。 衝突判定: 1.添付図の左端のようなAとBが与えられた時、Bの1頂点、例えばQ1が原点に重なり、辺Q1・Q2が垂直になるよう、長方形AとBを座標変換(※1)します。その結果が、添付図の中央。 2.Pi(x,y)のxと同じx値を持つ点が、Qj(x,y)にあるか、iとjをループさせながら調べます。xが終わったら、yも同様に調べます。 添付図の中央からは、次の結果が得られます。 「P4のx」=「Q1のx」=「Q2のx」 「P3のy」=「Q2のy」=「Q3のy」 3.Pに対して、Qが2つ無ければ、Bの辺にではなく、Bの端点に衝突しているので、対象外。 Pに対して、Qが2つある場合、同じ値でなない方の成分を比較し、次が成立すれば、「AがBの辺に衝突している」と判定(※2)します。 値が小さい方のQの成分値<Pの成分値<値が大きい方のQの成分値 4.Bの頂点Qの組み合わせから、どの辺に衝突しているか求める ※1.座標変換せず、各辺をベクトルと考え、Q1からQ2へのベクトルは、V(Q1,Q2)で表すものとすれば、「点P4がV(Q1,Q2)の内分点か?」のように判定する方法もあります。 ※2.判定事例 添付図の中央のP4では、「Q1のy値<P4のy値<Q2のy値」が成立するので、Aは点P4でBの辺に衝突しています。 P3では、「Q2のy値<P3のy値<Q3のy値」が成立しないので、点P3はBの辺に衝突していません。 添付図の右端の中段では、「Qのy値=Pのy値<Qのy値」や「Qのy値<Pのy値=Qのy値」なので、AはBの頂点に衝突しており、辺には衝突していません。 これも衝突に含めたいなら、問題文の条件設定と、判定条件を変更してください。 添付図 (クリックで拡大するはず)