0

我正在尝试使用 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;
}

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

4

5 回答 5

1

根据文档

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

如果您希望它在 interval 上返回一个值[0, +2pi],那么是的,您将需要应用一些修复。

于 2014-07-17T19:48:21.797 回答
1

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

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

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

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

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

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

于 2014-07-17T20:06:31.600 回答
0

根据文档,atan2return 总是在范围内[-pi, pi],所以我认为你不会看到-200 deg你建议的 a 。也就是说,它仍然将第三和第四象限的结果返回为负值。由于该函数显式调用了此行为,因此最直接的解决方案是将2pi弧度添加到负返回结果中。

于 2014-07-17T19:48:28.953 回答
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.
}
于 2014-07-17T19:57:49.327 回答
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;
}
于 2014-07-22T08:37:28.260 回答