楕円とは、「ある二点からの距離の和が常に一定である点の集合」である。
この「ある二点」を焦点と呼び、「一定」の値は長軸(縦横のうち長い方の幅)の長さとなる。
即ち、横に長い楕円(回転はしない)に限れば、中心の座標、焦点同士の距離、長軸の長さ、という3つの情報から楕円は一意に定まる。
そんな楕円に対して、ある点から当たり判定をけしかけたい。
やることは単純で、点と二焦点との距離の和が横幅より小さければ点は内部にあり、大きければ点は外部にある。
script.js
//点(x1,y1)が楕円[中心(x2,y2), 焦点から中心までの距離f, 横幅w]の内部にあるかどうかを判定する関数
function detectEllipseCollision(x1, y1, x2, y2, f, w){
if(hypo(x1,y1,x2+f,y2) + hypo(x1,y1,x2-f,y2) <= w){
return true;
} else {
return false;
}
}
function hypo(x1, y1, x2, y2){//二点(x1,y1), (x2,y2)の距離を返す関数
return Math.pow(Math.pow(x1-x2,2)+Math.pow(y1-y2,2), 1/2);
}
こいつをなんやかんや上手いことやれば、楕円と円、楕円と楕円、回転楕円における当たり判定も実装できる(はず)。