有没有一种方法可以确保安全,并且仅用最少数量的案例说明来处理缠角问题。

当使用特定的角度表示形式(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/

10-13 04:15