いくつかの「部分」に分割されたこのグラフのような円があります。キャンバス上で drawArc を使用してこれらを描画します。
canvas.drawArc(oval, startAngle, sweepAngle, true, fillPaint);
ユーザーがアークをタップしたときにイベントをトリガーできるように、これらのアークをクリック可能にしたいと考えています。そこで、onTouchEvent をオーバーライドしてから、ACTION_DOWN のすべての部分を調べて、タッチ位置がそれらの範囲内にあるかどうかを確認することにしました。
私は同様の質問に答えているこのコードをここで試しましたが、奇妙な角度の値を取得しています (つまり、右上の象限の負の値、残りの 180 から 270 の間の値)。
public boolean isInArea(float x, float y){
int deltaX = (int) (x - oval.centerX());
int deltaY = (int) (y - oval.centerY());
if (Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)) > mRectShape.width()/2) {
return false;
}
// offset for radiant, depending on quadrant
double offset = 0;
if (deltaX > 0 && deltaY < 0) {
// top right -> nothing to do
} else if (deltaX > 0 && deltaY > 0) {
// bottom right -> add 90 degrees
offset = Math.PI/2;
} else if (deltaX < 0 && deltaY > 0) {
// bottom left -> add 180 degrees
offset = Math.PI;
} else if (deltaX < 0 && deltaY < 0) {
// top left -> add 270 degrees
offset = Math.PI * 3/2;
}
//now calculate angle
double angle = Math.asin(deltaY / deltaX);
double total = angle + offset;
double totalDeg = total * 180 / Math.PI;
Log.d(LOG_TAG, "angle :" + totalDeg);
if(totalDeg > mStartAngle && totalDeg < mSweepAngle){
return true;
}
return false;
}
また、オフセットnandを設定せずに試してみたところ、上の象限には負の値が、下の象限には0から180の間の正の値が得られました。
また、次のようにatan2を使用してみました:
angle = Math.atan2(deltaY, -deltaX);
ここで何が欠けていますか?