当たり判定をチェックするには、円で計算したほうが楽です。
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 件のコメント:
コメントを投稿