gpt4 book ai didi

c++ - 在 C++ 代码中处理 Angle Wrap

转载 作者:IT老高 更新时间:2023-10-28 12:42:16 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

最佳答案

为了完整起见,我将同时包含 [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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com