1

对不起,如果标题听起来令人困惑 - 但这是我想要做的:

我有一个大的圆形按钮,可以在上面检测触摸方向。我可以从触摸输入坐标变化的 dy 和 dx 中找到 UP/DOWN/LEFT/RIGHT,如下所示:

          if(Math.abs(dX) > Math.abs(dY)) {
              if(dX>0) direction = 1; //left
              else direction = 2; //right
          } else {
              if(dY>0) direction = 3; //up
              else direction = 4;   //down
          }

但是现在我想处理按钮可以稍微旋转的情况,因此触摸方向也需要为此进行调整。例如,如果按钮稍微向左旋转,则 UP 现在是向西北移动的手指,而不仅仅是纯正北方。我该如何处理?

4

1 回答 1

2

使用Math.atan2(dy, dx)从坐标的正水平方向逆时针获取角度(以弧度为单位)

double pressed = Math.atan2(dY, dX);

从这个角度减去旋转量(以弧度为单位的逆时针旋转量),将角度放入按钮的坐标系中

pressed -= buttonRotation;

或者如果您的角度以度为单位,请将其转换为弧度

pressed -= Math.toRadians(buttonRotation);

然后你可以从这个角度计算一个更简单的方向数

int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4);

这给出了右 0、上 1、左 2 和下 3。我们需要纠正角度为负的情况,因为模结果也将为负。

if (dir < 0) {
    dir += 4;
}

现在假设这些数字不好并且您不想使用它们,您可以打开结果以返回每个方向您喜欢的任何内容。把所有这些放在一起

/**
 * @param dY
 *      The y difference between the touch position and the button
 * @param dX
 *      The x difference between the touch position and the button
 * @param buttonRotationDegrees
 *      The anticlockwise button rotation offset in degrees
 * @return 
 *      The direction number
 *      1 = left, 2 = right, 3 = up, 4 = down, 0 = error
 */
public static int getAngle(int dY, int dX, double buttonRotationDegrees)
{
    double pressed = Math.atan2(dY, dX);
    pressed -= Math.toRadians(buttonRotationDegrees);

    // right = 0, up = 1, left = 2, down = 3
    int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4);

    // Correct negative angles
    if (dir < 0) {
        dir += 4;
    }

    switch (dir) {
        case 0:
            return 2; // right
        case 1:
            return 3; // up
        case 2:
            return 1; // left;
        case 3:
            return 4; // down
    }
    return 0; // Something bad happened
}
于 2012-04-04T20:12:51.587 回答