点と多角形の各点とのなす角の合計が360°になる場合、その点が多角形に内包されている、ということになるらしい。
この判定用の関数をJavaScriptで書いたものが以下。
judgeInclusion = function(p1, comparisonArr) {
var deg = 0;
var p1x = p1.x;
var p1y = p1.y;
for (var index = 0; index < comparisonArr.length; index++) {
var p2x = comparisonArr[index].x;
var p2y = comparisonArr[index].y;
if (index < comparisonArr.length - 1) {
var p3x = comparisonArr[index + 1].x;
var p3y = comparisonArr[index + 1].y;
} else {
var p3x = comparisonArr[0].x;
var p3y = comparisonArr[0].y;
}
var ax = p2x - p1x;
var ay = p2y - p1y;
var bx = p3x - p1x;
var by = p3y - p1y;
var cos = (ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by));
deg += getDegree(Math.acos(cos));
}
if (Math.round(deg) == 360) {
return true;
} else {
return false;
}
};
独自の衝突判定を書きたい場合などに使えそう。
デモ
参考
http://kone.vis.ne.jp/diary/diaryb09.html
http://www.sousakuba.com/Programming/gs_two_vector_angle.html