有没有一种方法可以确保安全,并且仅用最少数量的案例说明来处理缠角问题。
当使用特定的角度表示形式(0-360度或-180-180度(或等价弧度))并且包裹整个角度时,就会发生角度折回。例如,假设您的角度为-170,然后减去50度。数学上,您的总和为-220,但实际上应该为+140度。
显然,您可以使用以下方法进行检查:
if (deg < -180) { 180 - abs(deg + 180); }
或类似。但是首先,您需要进行大量检查,其次,如果您包装两次,它将不起作用。
普遍存在的第二种情况是两个角度之间的插值。
例如,假设我的角度为-170度和160度,我想在两者之间进行调整。常用的方法是
ang1 + 0.5(ang2-ang1)
,但在示例中我提供了该角度,当角度应为175时,它将导致-5度。在这些情况下,有没有通用的方法来处理角度包裹?
最佳答案
为了完整起见,我将同时包括[0, 360)
和[-180, 180)
规范化。
您将需要#include <math.h>
。
标准化为[0,360)
:
double constrainAngle(double x){
x = fmod(x,360);
if (x < 0)
x += 360;
return x;
}
标准化为
[-180,180)
:double constrainAngle(double x){
x = fmod(x + 180,360);
if (x < 0)
x += 360;
return x - 180;
}
该模式应该足够容易识别以推广到弧度。
角平分:
double angleDiff(double a,double b){
double dif = fmod(b - a + 180,360);
if (dif < 0)
dif += 360;
return dif - 180;
}
double bisectAngle(double a,double b){
return constrainAngle(a + angleDiff(a,b) * 0.5);
}
这应在“较小”侧将角度平分。 (警告:未完全测试)
关于c++ - 用C++代码处理Angle Wrap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11498169/