当たり判定アルゴリズムの数学
2点間の距離公式と座標の不等式だけで、ゲームの「衝突」を判定する仕組み
- 1
- 円と円の当たり判定は、2つの中心間の距離が半径の和より小さいかどうかという「距離公式の不等式」だけで判定できる
- 2
- 四角形同士の当たり判定(AABB: Axis-Aligned Bounding Box)は、各軸(x, y)の座標の範囲が重なっているかを調べる不等式の組み合わせで判定できる
- 3
- 三平方の定理から導かれる2点間距離の公式 が、ゲームエンジンの物理演算・衝突検出の最も基礎的な計算式である
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
円と円の当たり判定は、2つの中心間の距離が半径の和より小さいかどうかという「距離公式の不等式」だけで判定できる
身につく武器・思考力
四角形同士の当たり判定(AABB: Axis-Aligned Bounding Box)は、各軸(x, y)の座標の範囲が重なっているかを調べる不等式の組み合わせで判定できる
実社会・ITでの活躍現場
- •2Dゲームエンジンにおける円・矩形の当たり判定(衝突検出)
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
赤い円と青い円をそれぞれドラッグして動かしてみよう。2つの円の中心間距離と半径の和がリアルタイムに比較され、円が重なると背景色と枠線が変化して「衝突(HIT)」と表示される。下のAABB(四角形)モードに切り替えると、x軸・y軸それぞれの範囲の重なりだけで判定する仕組みも確認できる。
↑ 円と円の当たり判定は「中心間距離 < 半径の和」という不等式1つで、矩形同士(AABB)の当たり判定は「x軸・y軸それぞれの範囲の重なり」という2つの不等式の連立で判定できます。ゲームエンジンの衝突検出はこの単純な計算の高速な積み重ねです。
中心 (0, 0) 半径 3 の円Aと、中心 (4, 0) 半径 2 の円Bがある。この2つの円は衝突しているか?
Layer 2 — 定義・受験・証明
定義
平面上の2点 , 間の距離は、三平方の定理より次の「距離公式」で与えられる。
中心 , 半径 の円と、中心 , 半径 の円が重なり合う(衝突する)ための必要十分条件は次の不等式で表される。
一方、辺が座標軸に平行な矩形(AABB)同士の衝突判定は、各軸への正射影(区間)が重なっているかどうかで判定でき、次のように書ける。
ここで は矩形の中心座標、 は幅・高さである。
公式・数理モデル
証明・導出
円と円の衝突判定の証明: 2つの円が「重なっている」とは、少なくとも1点が両方の円の内部に共通して存在することと同値である。 中心間の距離を とすると、2円が接する(境界だけが触れる)のはちょうど (外接)または (内接)のときである。 が単調に小さくなるにつれ2円は近づき、 を満たす瞬間から円の内部同士が重なり始める(中間値の定理により、2円の境界を表す方程式 と を同時に満たす実数解 が存在する)。 したがって距離公式による不等式 が円同士の重なり(衝突)の必要十分条件となる。
AABB(矩形)の場合の証明(分離軸定理の特別なケース): 2つの凸図形が重ならない必要十分条件は「両者を分離する直線(分離軸)が存在すること」である(分離軸定理, SAT)。 座標軸に平行な矩形同士では、分離軸の候補はx軸方向とy軸方向の2つだけでよい。 x軸方向に分離している ⟺ 、y軸方向も同様。 どちらの軸でも分離していない(=両方の不等式が逆転している)ときにのみ矩形は重なるため、上記の連立不等式が衝突条件となる。
押さえておきたいポイント
- 円同士の判定は「平方根の計算」を毎フレーム行うと重いため、実装上は両辺を2乗した で比較し平方根を省略するのが定石
- AABBは回転を考慮しないため高速だが不正確。回転する矩形の厳密判定には分離軸定理(SAT)をより多くの軸に拡張する必要がある
- 衝突判定はまず高速な「大まかな判定(ブロードフェーズ、AABBなど)」で候補を絞り、次に「精密な判定(ナローフェーズ、円やポリゴンの厳密計算)」を行う2段階構成が一般的
- この距離公式とAABB判定は物理エンジン(Box2D, Unity, Unreal Engine)の衝突検出システムの最も基礎的な計算単位である
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
2Dゲームエンジンにおける円・矩形の当たり判定(衝突検出)
2Dゲームの物理演算で頻出する「円 vs 円」「矩形 vs 矩形(AABB)」の当たり判定を、距離公式と座標の範囲比較だけで高速に計算する典型的な実装。平方根の計算を避けるため2乗のまま比較している点が実務上のポイント。
1type Circle = { x: number; y: number; radius: number };2type AABB = { x: number; y: number; width: number; height: number }; // x,yは中心座標34// 円 vs 円の当たり判定(距離の2乗で比較し、平方根の計算を省略)5function circleVsCircle(a: Circle, b: Circle): boolean {6 const dx = b.x - a.x;7 const dy = b.y - a.y;8 const distSq = dx * dx + dy * dy;9 const radiusSum = a.radius + b.radius;10 return distSq < radiusSum * radiusSum;11}1213// AABB(軸並行境界ボックス)vs AABBの当たり判定14function aabbVsAabb(a: AABB, b: AABB): boolean {15 const overlapX = Math.abs(a.x - b.x) < (a.width + b.width) / 2;16 const overlapY = Math.abs(a.y - b.y) < (a.height + b.height) / 2;17 return overlapX && overlapY;18}1920// 使用例: プレイヤーの弾(円)と敵キャラ(矩形)風の簡易判定21const bullet: Circle = { x: 5, y: 5, radius: 0.5 };22const enemyHitbox: Circle = { x: 6, y: 5.2, radius: 1 };2324if (circleVsCircle(bullet, enemyHitbox)) {25 console.log("命中! ダメージ処理を実行");26} else {27 console.log("ミス");28}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元