dellblorin日記

袖擦り合うも他生の縁

2Dゲームの円形当たり判定アルゴリズム

2Dゲームの当たり判定に円形を用いた当たり判定がある。円形の当たり判定はピタゴラスの定理を使い斜線の距離から割り出す。ピタゴラスの定理とは、直角三角形の斜辺(c)の二乗は他二辺(a, b)をそれぞれ二乗した値の和に等しい、という定理。

a² + b² = c²

斜辺以外の二辺の長さが分かれば斜辺の長さも分かる(a + bの値を素因数分解)。下図のように二点間の円形の当たり判定を求める場合、まず直角三角形を作る。

円形の当たり判定の解説イラスト

点と点の場合、cが0以下か0を超えるかで判定。円は半径があるため、互いの半径の合計と比較。比較対象が二乗されているので半径も二乗する((pr + er) * (pr + er))。二点間の距離が0かそれを超えるか知りたいだけのため、素因数分解までして正確なcは求めない。

当たり判定部分のコードは以下。actionscript3.0で記述。

if ((bx - ax) * (bx - ax) + (by - ay) * (by - ay) <= (ar + br) * (ar + br)) {
    // hit
}

下が円形の当たり判定を行うCircleHitTestクラスのソースコード

package com.hatenablog.dellblorin 
{
    public class CircleHitTest {
        
        public function CircleHitTest() {
            
        }
        
        public function init():void {
            
        }
        
        public static function hitTest(ax:Number = 0, ay:Number = 0, ar:Number = 0, bx:Number = 0, by:Number = 0, br:Number = 0):Boolean {
            var hit:Boolean = false;
            if ((bx - ax) * (bx - ax) + (by - ay) * (by - ay) <= (ar + br) * (ar + br)) {
                hit = true;
            }
            
            return hit;
        }
    }
}