GettingSignals

[Android]回転矩形と点の当たり判定

2012年6月25日
Posted by hina

Matrixで回転させた矩形をタッチしたかどうかを判定します。

当たり判定をチェックするには、円で計算したほうが楽です。

public boolean isPointInside(PointF point, float x, float y) {
// 標的とタッチされたポイントとの距離を計算します
    float dx = x – (point.x);
    float dy = y – (point.y);
float distance = (float) Math.sqrt(dx * dx + dy * dy);

if (distance <= curRatio * bmpWidth / 2) {
return true;
}
return false;
}

ただし、これ正方形の画像にしか使えないです。
今回は、
長方形の画像の判定をしようと思います。
回転したあとの矩形の位置から範囲を計算しようとすると、とっても複雑なのでした。
そこで矩形を回転させるのではなく、
点を矩形を回転させた分だけ移動させることによって判定します。
ということが、こちらの資料に書いてました。
http://www.club.konan-u.ac.jp/~KSWL/tech/archives/2010/develop/Hit_judgment_of_rotating_rectangle_and_point.pdf
この資料を元にAndroidに書いてみました。

     //ポイントが当たり判定の範囲内かを返します

        public boolean isPointInside(PointF pt) {
        boolean blRet = false;
// 表示されている画像範囲の計算
float half_w = mBitmap.getWidth() * mScale / 2;
float half_h = mBitmap.getHeight() * mScale / 2;
float left = center.x – half_w;
float right = center.x + half_w;
float top = center.y – half_h;
float bottom = center.y + half_h;
RectF rect = new RectF(left, top, right, bottom);
// (1) 矩形の中心と点の距離を計算
double l = Math.sqrt(Math.pow(pt.x – center.x, 2) + Math.pow(pt.y – center.y, 2));
// (2)矩形の中心を原点として見た相対的な点C’の座標
PointF pt2 = new PointF();
pt2.x = pt.x – center.x;
pt2.y = pt.y – center.y;
// (3)点D’と横軸のなす角r2を求める
double r1, r2;
if(pt2.x != 0) {r1 = Math.atan(pt2.y / pt2.x);}
else{r1 = Math.PI / 2;}
r2 = r1 – mAngle;
// (4)点D’の座標
PointF pt3 = new PointF();
pt3.x = (float)(l * Math.cos(r2));
pt3.y = (float)(l * Math.sin(r2));
// (5)点Dに戻す
pt3.x += center.x;
pt3.y += center.y;
// 普通の矩形と点の当たり判定
if(rect.left <= pt3.x && pt3.x <= rect.right &&
  rect.top <= pt3.y && pt3.y <= rect.bottom) {
blRet = true;
}
return blRet;
        }
こんな感じ。
Share

Comments are currently closed.

Follow

カレンダー

2024年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031