1. 無職の学び舎
  2. >
  3. 無職はゲーム数学の勉強をする
  4. >
  5. 矩形と矩形の衝突

矩形と矩形の衝突

回転しない矩形と矩形の衝突についてまとめていきます。

考え方

回転しない矩形同士の判定は特に難しい計算は登場しません。

ただ、この時は当たっていない、この時も当たっていない、と当たっていないケースを愚直に判定していきます。

実際に図で見たほうがわかりやすいと思うので図解していきます。

一方の矩形を $R1$、もう一つの矩形を $R2$ とします。

$R2$ が $R1$ の左にあってあたってないケース

$R2$ の右端 の $x$ 座標が、$R1$ の左端の $x$ 座標より小さければ、これはもう当たっていません。

$R2$ が $R1$ の右にあって、あたってないケース

$R2$ の左端 の $x$ 座標が、$R1$ の右端の $x$ 座標より大きければ、これはもう当たっていません。

$R2$ が $R1$ の下にあって、あたってないケース

$R2$ の上端 の $y$ 座標が、$R1$ の下端の $y$ 座標より小さければ、これはもう当たっていません。

$R2$ が $R1$ の上にあって、あたってないケース

$R2$ の下端 の $y$ 座標が、$R1$ の上端の $y$ 座標より大きれば、これはもう当たっていません。

上記4パターン以外であれば当たっている

$R2$ が $R1$ の完全に左にあるのか、右にあるのか、下にあるのか、上にあるのか

いずれかの条件に一致した瞬間、矩形同士は衝突していないことになります。

逆に、全ての条件に一致しなかった場合、矩形同士は衝突しています。

条件が多く、ちょっとややこしさはありますが、落ち着いて考えれば難しくないと思います。

サンプルコード

/**
  * 矩形と矩形が当たっているかどうか
  * @param r1 矩形1
  * @param r2 矩形2
  */
 export function isHit(r1:Rect, r2:Rect) 
 {
   // x座標に関する判定
   if (r2.maxX < r1.minX) return false;
   if (r1.maxX < r2.minX) return false;
 
   // y座標に関する判定
   if (r2.maxY < r1.minY) return false;
   if (r1.maxY < r2.minY) return false;
 
   return true;
 }