处理c ++角度的符号变化

时间:2014-07-17 19:34:07

标签: c++ math degrees radians

我正在尝试使用c ++通过中心点识别两点之间的角度。我正在使用std :: atan2(y,x)来获得角度。为简洁起见,我将弧度转换为度数。这工作正常。

然而,当两点的位置发生变化时,我的问题在于符号变化。给定的角度是-200或160.当然,这是相同的角度仅360度。我宁愿拥有相同的价值来使比较检查得到理智。我怎样才能做到这一点?

我用来计算角度的函数,并转换为度数:

static double computeAngleFromCenter(cv::Point center, cv::Point p, bool asDegrees = false)
{
    double angle = std::atan2(p.y - center.y, p.x - center.x);

    if (asDegrees)
        angle *= 180 / 3.1415926;

    return angle;
}

显而易见的答案是,如果角度<1,则只需添加360。 0,但这是最好的方法吗?

5 个答案:

答案 0 :(得分:1)

根据the documentation

  

返回值:
  区间为[-pi,+ pi]的y / x的主反正切   弧度。一个弧度相当于180 / PI度。

如果您希望在[0, +2pi]间隔内返回一个值,那么是的,您需要应用一些修正。

答案 1 :(得分:1)

您可以在有条件转换为度数之前使用fmod:

angle = fmod( angle + PI * 2, PI * 2 );

取决于编译器和数学库,它可能比更直接的代码更快或更慢,更容易阅读:

if (angle < 0)
    angle += PI * 2;

如果此代码仅在台式机上每秒使用数百次,我怀疑您是否会注意到差异。对于手机/平板电脑,也许我会将这个限制设置为每秒数十次。

编辑:负角度需要添加PI * 2,而不只是PI

答案 2 :(得分:0)

根据atan2的文档,返回始终在[-pi, pi]范围内,所以我不认为您会看到-200 deg正如您所建议的那样。这说确实仍然将第3和第4象限的结果作为负值返回。由于函数显式地调用了这种行为,因此最直接的解决方案是将2pi弧度添加到负返回结果中。

答案 3 :(得分:0)

更直接的可能:

static double computeAngleFromCenter(cv::Point center, cv::Point p, bool asDegrees = false)
{
    double angle = std::atan2(p.y - center.y, p.x - center.x);

    if (asDegrees)
        angle *= 180 / 3.1415926;

    return angle + 360; // [180, 540] Always positive.
}

答案 4 :(得分:0)

static double computeAngleFromCenter(cv::Point center, cv::Point p, bool asDegrees = false)

{
    double angle = std::atan2(p.y - center.y, p.x - center.x);

    if (asDegrees)
        angle *= 180 / 3.1415926;
        if(angle<0)angle+=360;
    return angle;
}