在c代码中处理Angle Wrap

新手上路,请多包涵

有没有一种安全的方法,可以用最少的案例语句简单地处理角度环绕。

当使用特定的角度表示法(0-360 度或 -180 - 180 度(或等效的弧度))并且您在角度上进行缠绕时,会发生角度缠绕。例如,假设您的角度为 -170,然后减去 50 度。您在数学上加起来是 -220,但实际上应该是 +140 度。

显然,您可以使用以下方法进行检查:

 if (deg < -180) { 180 - abs(deg + 180); }

或类似的。但首先你需要大量的检查,其次如果你包装两次它就不起作用。

第二种普遍存在的情况是两个角度之间的插值。

例如,假设我有一个 -170 度和 160 度的角度,我想介于它们之间。一种常见的方法是 ang1 + 0.5(ang2-ang1) 但在我提供的示例中,它将导致角度为-5度,而它应该是175度。

在这些情况下是否有处理角度包络的常用方法?

原文由 Fantastic Mr Fox 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

为了完整起见,我将包括 [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);
}

这应该在“较小”一侧平分一个角度。 (警告:未完全测试)

原文由 Mysticial 发布,翻译遵循 CC BY-SA 3.0 许可协议

auto new_angle = atan2(sin(old_angle), cos(old_angle));

原文由 KosTTTT 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏