角度环绕错误(错误处理 0、pi、-pi)

问题描述 投票:0回答:1

我试图将角度包裹在 [-pi, pi] 范围内。我尝试了以下代码的许多变体,这应该是一个非常简单的任务,但是,如果角度已经是 pi、-pi 或 0,它会将其输出为负数(因此 pi = -pi、-pi = pi, 0 = -0).

这是我目前拥有的代码:

static double wrapAngle( double angle){
    while (angle < -M_PI) {
        angle += 2.0 * M_PI;
    }
    while (angle > M_PI) {
        angle -= 2.0 * M_PI;
    }
    return angle;
}

它正确地包装了除 -M_PI、M_PI 和 0 之外的所有内容。它给了我负数。

c++ angle
1个回答
0
投票

您的代码在小于 -pi 时递增 2pi,在大于 pi 时递减 2pi。通常人们会期望它以 +-2pi 的步长重复收敛到 [-pi, pi] 区间。

然而,您观察到结果在幅度上似乎是正确的,但在符号上却不正确。这样想:如果你已经有 0,即使这样它也会反转符号,而你的算法显然不会改变它。

因此,您在其他地方有一个错误,在您未在此处共享的部分代码中,并且该错误反转了符号,而您的算法看起来大部分都很好,唯一担心的是累积舍入错误,这可以通过执行以下操作来帮助:单次计算(首先通过除法找出有多少个周期,然后将所述周期数乘以 +-2pi),而不是按 +-2pi 的步长移动。

© www.soinside.com 2019 - 2024. All rights reserved.