2012年6月25日月曜日

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

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

ただし、これ正方形の画像にしか使えないです。


今回は、
長方形の画像の判定をしようと思います。

回転したあとの矩形の位置から範囲を計算しようとすると、とっても複雑なのでした。

そこで矩形を回転させるのではなく、
点を矩形を回転させた分だけ移動させることによって判定します。
ということが、こちらの資料に書いてました。
この資料を元に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;
        }

こんな感じ。


0 件のコメント:

コメントを投稿