c++中的atan和atan2有什么区别?


当前回答

从学校数学中我们知道了正切的定义

tan(α) = sin(α) / cos(α)

我们根据函数的角度来区分四个象限。sin, cos和tan的符号有以下关系(这里我们忽略π/2的精确倍数):

  Quadrant    Angle              sin   cos   tan
-------------------------------------------------
  I           0    < α < π/2      +     +     +
  II          π/2  < α < π        +     -     -
  III         π    < α < 3π/2     -     -     +
  IV          3π/2 < α < 2π       -     +     -

已知tan(α)是正的,我们无法区分这个角是来自第一象限还是第三象限,如果它是负的,它可能来自第二象限或第四象限。因此,按照惯例,atan()返回一个来自第一象限或第四象限的角度(即-π/2 <= atan() <= π/2),而不管原始输入的正切值如何。

为了得到完整的信息,我们不能使用sin(α) / cos(α)除法的结果,但我们必须分别查看sin和cos的值。这就是atan2()所做的。它同时取sin(α)和cos(α),当余弦为负时,通过将π加到atan()的结果中来求解所有四个象限。

注意:atan2(y, x)函数实际上有一个y和一个x参数,这是一个长度为v和角度为α的向量在y轴和x轴上的投影,即。

y = v * sin(α)
x = v * cos(α)

它给出了一个关系

y/x = tan(α)

结论: atan(y/x)保留了一些信息,人们只能假设输入来自象限I或IV。相反,atan2(y,x)获得所有数据,因此可以解析正确的角度。

其他回答

我猜主要的问题是试图弄清楚:“我应该什么时候使用一个或另一个”,或者“我应该使用哪个”,或者“我使用的是正确的”?

我想重要的一点是,atan只是为了在一个右向上的方向曲线上提供正的值,就像时间-距离向量一样。0总是在左下角,thigs只能向上或向右移动,只是速度变慢或变快。Atan不返回负数,所以你不能仅仅通过加/减结果在屏幕上的4个方向上跟踪事物。

Atan2的目的是让原点位于中间,并且可以向后或向下。这就是你在屏幕表示中使用的,因为你想让曲线走向什么方向确实很重要。atan2可以给出负数,因为它的0在中间,它的结果可以用来在4个方向上进行追踪。

atan(x)返回x的arctan的主值,用弧度表示。

atan2(y,x)返回y/x的arctan的主值,用弧度表示。

请注意,由于符号的模糊性,函数不能确定角度落在哪个象限,仅通过其正切值(atan)确定。如果需要确定象限,可以使用atan2。

Std::atan2允许计算所有四个象限的arctan。Std::atan只允许从象限1和4计算。

另一件需要提及的事情是,当使用atan(y / x)这样的表达式计算切线时,atan2更稳定,而x等于0或接近0。

实际值以弧度为单位,但用度来解释它们将是:

Atan =给出的角度值介于-90和90之间 Atan2 =给出的角度值在-180和180之间

在我的工作中,涉及到在导航中计算航向和方位等各种角度,atan2在大多数情况下可以完成这项工作。