我需要将标准 360 角的计算反向到 atan2。
这是我的标准角度计算
Standard angle = (int) Math.toDegrees(Math.atan2(y,x));
if(angle < 0)
angle += 360;
我需要从角度如何实现 Math.atan2 值。
将度数范围0..360
转换为弧度范围-Pi..Pi
:
if(angle > 180)
angle -= 360;
angle_radians = Math.toRadians(angle);
如果您的角度可能超出标准范围(您没有提到这一点),请使用整数模而不是循环
angle = angle % 360
(检查模运算符如何处理您的语言中的负数)
虽然你的问题不是很清楚,但似乎你想检索语句之前的角度
if (angle < 0)
angle += 360;
Asatan2
返回范围内的值[-π,π)
,即[-180°,180°)
,子范围[-180°,0°)
被映射到[180°,360°)
。然后你反转
if (angle >= 180°)
angle-= 360;
您还需要转换回弧度。
具有 O(1) 性能的通用解决方案:
double generalModulus(double value, double modulus, double offset) {
return value - Math.floor((value-offset)/modulus) * modulus + offset;
}
double normalizeAngleDegrees(double angleInDegrees, double offset) {
return generalModulus(angleInDegrees, 360.0, offset);
}
double normalizeAngleRadians(double angleInRadians, double offset) {
return generalModulus(angleInRadians, 2.0*Math.PI, offset);
}
要使用:
double normDeg = normalizeAngleDegrees(angle, -180); // produces angle in range [-180, 180)
double normRad = normalizeAngleRadians(angle, 0); // produces angle in range [0, 2*Pi)
我自己的答案
int normalizeAngle(int angle)
{
int newAngle = angle;
while (newAngle <= -180) newAngle += 360;
while (newAngle > 180) newAngle -= 360;
return newAngle;
}