2012年6月8日金曜日
[Android]多角形の当たり判定
タッチしたポイントがPathの範囲内かどうかをチェックする方法です。
矩形の場合は、
Rect().contains(x, y)を使えば判定可能です。
今回は、
三角形、台形、五角形などの多角形の範囲内かどうかをチェックします。
パラメータpointsには、各座標(x,y)の値をリストで格納しています。
パラメータpは、タッチした座標。
判定方法は、地点q→地点nの2点を結んだ線分に対して、
地点pが右にあるか左にあるかでチェックしています。
右にある( 0 < height )場合、範囲内です。
左にある( height < 0)場合、範囲外です。
線上は(0 == height)となります。
private boolean checkPoint(ArrayList<PointF> points, PointF p) {
int point_num = points.size();
for(int i=0; i < point_num; i++) {
PointF q = points.get(i);
PointF n = new PointF();
int j = i + 1;
if(j < point_num) {
n = points.get(j);
} else { // 最後のpointは先頭と結ぶ
n = points.get(0);
}
float height = 0;
height = p.x * (q.y - n.y) + q.x * (n.y - p.y) + n.x * (p.y - q.y);
if(height < 0) {
return false; // 範囲外
}
}
return true;
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿