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

在c++中,atanatan2有什么区别?

197540 次浏览

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

使用atan2,您可以确定象限在这里

如果需要,可以使用atan2 确定象限

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

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

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

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

考虑一个直角三角形。我们把斜边标记为r,水平线为y,垂直线为x。是x和r的夹角。

c++ atan2(y, x)将给我们angle &alpha的值;在弧度。 atan用于只知道或只对y/x感兴趣,而不是分别对y和x感兴趣。如果p = y/x 然后得到α我们将使用atan(p).

你不能使用atan2来确定象限,只有当你已经知道你所在的象限时,你才能使用atan2 !特别是正的x和y表示第一象限,正的y和负的x,第二象限等等。atanatan2本身只是返回一个正数或负数,仅此而已。

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

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

我们根据函数的角度来区分四个象限。sincostan的符号有以下关系(这里我们忽略了π/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 =给出-90到90之间的角度值
  • atan2 =给出在-180和180之间的角度值

对于我的工作,涉及到计算各种角度,如航向和方向在导航,atan2在大多数情况下做的工作。

下面的Mehrwolf是正确的,但这里有一个启发式可能会有所帮助:

如果你在一个二维坐标系中工作,这是编程反切线的常见情况,你肯定应该使用atan2。它会给出完整的2范围的角度并为你照顾到x坐标中的0。

另一种说法是,atan(y/x)总是错的。只有当参数不能被认为是y/x时才使用atan。

atan2(y,x)通常用于将笛卡尔坐标转换为极坐标。它会给你角度,而sqrt(x*x+y*y)hypot(y,x)会给你尺寸。

atan(x)只是tan的逆。在恼人的情况下,你必须使用atan(y/x),因为你的系统没有提供atan2,你必须做额外的检查xy的符号,以及x=0,以获得正确的角度。

注意: atan2(y,x)定义为yx的所有实值,除非两个实参都为零。

在atan2中,输出为:-pi <atan2(y,x) <pi
在atan中,输出为:-pi/2 <atan(y/x) & lt;pi/2 //it dose NOT considered the quarter.
. 如果你想获得02*pi之间的方向(就像高中数学一样),我们需要使用atan2,对于负值,添加2*pi以获得02*pi之间的最终结果 下面是Java源代码来解释清楚:

System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter


System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter


System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter


System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4