很抱歉,如果标题听起来令人困惑 - 但这就是我想要做的事情:
我有一个大的圆形按钮,我在其上检测触摸方向。我可以从触摸输入坐标变化的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现在是手指向西北移动而不是纯北移动。我该如何处理?
答案 0 :(得分: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
}