GettingSignals

[Android]多角形の当たり判定

2012年6月8日
Posted by hina

タッチしたポイントが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;
}

Share

Comments are currently closed.

Follow

カレンダー

2024年4月
1234567
891011121314
15161718192021
22232425262728
2930