使用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
}