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;
}



0 件のコメント:

コメントを投稿