Math World Lab

当たり判定アルゴリズムの数学

2点間の距離公式と座標の不等式だけで、ゲームの「衝突」を判定する仕組み

この単元の発見をシェア
3行要約(Key Takeaways / AIOサマリー)
1
円と円の当たり判定は、2つの中心間の距離が半径の和より小さいかどうかという「距離公式の不等式」だけで判定できる
2
四角形同士の当たり判定(AABB: Axis-Aligned Bounding Box)は、各軸(x, y)の座標の範囲が重なっているかを調べる不等式の組み合わせで判定できる
3
三平方の定理から導かれる2点間距離の公式 (x2−x1)2+(y2−y1)2\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} が、ゲームエンジンの物理演算・衝突検出の最も基礎的な計算式である

なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値

Purpose & Motivation

なぜ生まれたのか?

円と円の当たり判定は、2つの中心間の距離が半径の和より小さいかどうかという「距離公式の不等式」だけで判定できる

身につく武器・思考力

四角形同士の当たり判定(AABB: Axis-Aligned Bounding Box)は、各軸(x, y)の座標の範囲が重なっているかを調べる不等式の組み合わせで判定できる

実社会・ITでの活躍現場

  • •2Dゲームエンジンにおける円・矩形の当たり判定(衝突検出)
  • •ITシステム・アルゴリズム実装における論理設計
  • •データ分析やシミュレーションにおける数理モデリング

Layer 1 — 直感・シミュレーター

赤い円と青い円をそれぞれドラッグして動かしてみよう。2つの円の中心間距離と半径の和がリアルタイムに比較され、円が重なると背景色と枠線が変化して「衝突(HIT)」と表示される。下のAABB(四角形)モードに切り替えると、x軸・y軸それぞれの範囲の重なりだけで判定する仕組みも確認できる。

図形をドラッグして重ねてみよう。当たり判定がリアルタイムに計算される。
当たり判定の計算式:セーフ(非衝突)
中心間距離 d=(x2−x1)2+(y2−y1)2d = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2} = 3.54
半径の和 r1+r2r_1 + r_2 = 2.70
判定: 3.54 ≥ 2.70 → 非衝突

↑ 円と円の当たり判定は「中心間距離 < 半径の和」という不等式1つで、矩形同士(AABB)の当たり判定は「x軸・y軸それぞれの範囲の重なり」という2つの不等式の連立で判定できます。ゲームエンジンの衝突検出はこの単純な計算の高速な積み重ねです。

直感チェック!ミニクイズ

中心 (0, 0) 半径 3 の円Aと、中心 (4, 0) 半径 2 の円Bがある。この2つの円は衝突しているか?

Layer 2 — 定義・受験・証明

定義

平面上の2点 P1=(x1,y1)P_1=(x_1,y_1), P2=(x2,y2)P_2=(x_2,y_2) 間の距離は、三平方の定理より次の「距離公式」で与えられる。

d(P1,P2)=(x2−x1)2+(y2−y1)2d(P_1, P_2) = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}

中心 C1C_1, 半径 r1r_1 の円と、中心 C2C_2, 半径 r2r_2 の円が重なり合う(衝突する)ための必要十分条件は次の不等式で表される。

d(C1,C2)<r1+r2d(C_1, C_2) < r_1 + r_2

一方、辺が座標軸に平行な矩形(AABB)同士の衝突判定は、各軸への正射影(区間)が重なっているかどうかで判定でき、次のように書ける。

∣c1x−c2x∣<w1+w22  ∧  ∣c1y−c2y∣<h1+h22|c_{1x}-c_{2x}| < \frac{w_1+w_2}{2} \;\land\; |c_{1y}-c_{2y}| < \frac{h_1+h_2}{2}

ここで c1,c2c_1, c_2 は矩形の中心座標、w,hw, h は幅・高さである。

公式・数理モデル

d(C1,C2)=(x2−x1)2+(y2−y1)2<r1+r2⟺円同士が衝突d(C_1, C_2) = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2} < r_1 + r_2 \quad\Longleftrightarrow\quad \text{円同士が衝突}

証明・導出

円と円の衝突判定の証明: 2つの円が「重なっている」とは、少なくとも1点が両方の円の内部に共通して存在することと同値である。 中心間の距離を dd とすると、2円が接する(境界だけが触れる)のはちょうど d=r1+r2d = r_1 + r_2(外接)または d=∣r1−r2∣d = |r_1 - r_2|(内接)のときである。 dd が単調に小さくなるにつれ2円は近づき、d<r1+r2d < r_1 + r_2 を満たす瞬間から円の内部同士が重なり始める(中間値の定理により、2円の境界を表す方程式 ∣P−C1∣=r1|P - C_1| = r_1 と ∣P−C2∣=r2|P - C_2| = r_2 を同時に満たす実数解 PP が存在する)。 したがって距離公式による不等式 d(C1,C2)<r1+r2d(C_1,C_2) < r_1+r_2 が円同士の重なり(衝突)の必要十分条件となる。

AABB(矩形)の場合の証明(分離軸定理の特別なケース): 2つの凸図形が重ならない必要十分条件は「両者を分離する直線(分離軸)が存在すること」である(分離軸定理, SAT)。 座標軸に平行な矩形同士では、分離軸の候補はx軸方向とy軸方向の2つだけでよい。 x軸方向に分離している ⟺ ∣c1x−c2x∣≥w1+w22|c_{1x}-c_{2x}| \ge \frac{w_1+w_2}{2}、y軸方向も同様。 どちらの軸でも分離していない(=両方の不等式が逆転している)ときにのみ矩形は重なるため、上記の連立不等式が衝突条件となる。

押さえておきたいポイント

  • 円同士の判定は「平方根の計算」を毎フレーム行うと重いため、実装上は両辺を2乗した d2<(r1+r2)2d^2 < (r_1+r_2)^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は中心座標
3
4// 円 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}
12
13// 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}
19
20// 使用例: プレイヤーの弾(円)と敵キャラ(矩形)風の簡易判定
21const bullet: Circle = { x: 5, y: 5, radius: 0.5 };
22const enemyHitbox: Circle = { x: 6, y: 5.2, radius: 1 };
23
24if (circleVsCircle(bullet, enemyHitbox)) {
25 console.log("命中! ダメージ処理を実行");
26} else {
27 console.log("ミス");
28}

次に学ぶならコレ!おすすめトピック

この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元

数理モデル・概念が近い関連トピック

関連度高工学応用

最短経路探索(ダイクストラ法とA*アルゴリズム)

グラフ上の無数のルートから「最もコストが小さい道」を一瞬で見つけ出す数学

Boids Swarm (Flocking)
関連度高工学応用

ボイドモデルと群衆シミュレーションのアルゴリズム

全体を操るリーダーはいない — 衝突回避・整列・凝集の3ルールから生まれる自己組織化の美

y = v₀t - ½gt²
関連度高中学数学

ゲーム物理とジャンプの放物線(二次関数の運動学)

「なぜマリオは気持ちよく跳べるのか?」重力加速度と二次関数で創る2Dアクションの物理

同じレベルで次に挑戦したいトピック

同レベル推薦工学応用

勾配降下法

谷底を探すAIの基本アルゴリズム

同レベル推薦工学応用

ニューラルネットワークの数学(順伝播と活性化関数)

入力に重みを掛けて足し合わせ、非線形関数で発火させるAIの基本素子

同レベル推薦工学応用

レコメンドの仕組み(コサイン類似度とベクトル検索)

ユーザーの好みと商品の近さを「ベクトルのなす角」で判定するアルゴリズム

工学・実社会での応用先でつながるトピック

工学・実践連携小学校・算数

円の面積と円周率

半径を変えると、円周と面積はどう変わる?

工学・実践連携小学校・算数

三角形・多角形の面積

頂点を動かして、面積の公式が成り立つ理由を確かめよう

工学・実践連携小学校・算数

単位変換(長さ・面積・体積)

長さが2倍になると、面積・体積は何倍になる?

あなたの数学力をさらに伸ばす

数学の弱点診断や算数パズルに挑戦してみませんか?

簡単な質問に答えてあなたにぴったりの学習ロードマップを発見したり、直感を試すパズルで数の面白さを体験できます。