在C ++中,atan和atan2有什么区别?

时间:2008-11-12 09:20:29

标签: c++ math.h

C ++中atanatan2之间有什么区别?

11 个答案:

答案 0 :(得分:273)

从学校数学我们知道切线有定义

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(α)的结果,但我们必须分别查看正弦和余弦的值。这就是atan2()的作用。它会同时使用sin(α)cos(α)这两个象限并通过在余弦为负时将π添加到atan()的结果来解析所有四个象限。

备注: atan2(y, x)函数实际上需要yx参数,这是长度为v的向量的投影和y轴和x轴上的角度α,即

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

给出关系

y/x = tan(α)

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

答案 1 :(得分:106)

std::atan2允许计算所有四个象限的反正切值。 std::atan仅允许从象限1和4进行计算。

答案 2 :(得分:23)

另外需要提及的是,atan2在使用atan(y / x)x等表达式计算切线时更稳定,为0或接近0。

答案 3 :(得分:20)

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

  • atan =给出介于-90和90之间的角度值
  • atan2 =给出-180到180之间的角度值

对于我的工作涉及各种角度的计算,例如导航中的航向和方位,atan2在大多数情况下都可以完成工作。

答案 4 :(得分:9)

atan(x)返回x的反正切的主值,以弧度表示。

atan2(y,x)返回y / x的反正切的主值,以弧度表示。

请注意,由于符号模糊,函数无法确定角度在哪个象限中仅由其正切值(仅atan)下降。如果需要确定象限,可以使用atan2。

答案 5 :(得分:3)

我想主要问题试图找出:“我应该何时使用其中一种”,或“我应该使用哪种”,或“我使用的是正确的”?

我想重要的一点是atan只是为了向正向上的方向曲线提供正值,就像时间距离向量一样。 Cero始终位于左下方,而且只能向上和向右,只是更慢或更快。 atan不会返回负数,因此您无法通过添加/减去其结果来在屏幕上的4个方向上跟踪事物。

atan2旨在使原点处于中间位置,并且事物可以向后或向下。这就是你在屏幕表示中使用的内容,因为它对你想要曲线的方向很重要。所以atan2可以给你负数,因为它的cero位于中心,它的结果可以用来跟踪4个方向的东西。

答案 6 :(得分:2)

使用atan2,您可以按照here所述确定象限。

  

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

答案 7 :(得分:2)

考虑一个直角三角形。我们标记斜边r,水平边y和垂直边x。感兴趣的角度@是x和r之间的角度。

c ++ atan2(y,x)将以弧度为单位给出angle @的值。 如果我们只知道或感兴趣y / x而不是y和x,则使用atan。所以如果p = y / x 然后得到@我们使用atan(p)。

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

答案 8 :(得分:0)

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

如果您正在使用二维坐标系统(通常是对反正切进行编程),则应使用atan2。它将提供完整的2 pi角度范围,并为您处理x坐标中的零。

另一种说法是,atan(y / x)实际上总是错误的。如果参数不能被认为是y / x,则只使用atan。

答案 9 :(得分:0)

如果要将笛卡尔坐标转换为极坐标,通常使用

atan2(y,x)。它会为您提供角度,而sqrt(x*x+y*y)hypot(y,x)会为您提供尺寸。

atan(x)只是棕褐色的倒数。在烦人的情况下,您必须使用atan(y/x),因为您的系统未提供atan2,您必须对xy的标志进行额外检查,并且对于x=0,为了获得正确的角度。

注意: atan2(y,x)是为yx的所有实际值定义的,但两个参数均为零的情况除外。

答案 10 :(得分:0)

在atan2中,输出为:-pi <atan2(y,x) <pi
而在atan中,输出为:-pi/2 <atan(y/x) <pi/2 //它不考虑四分之一。
如果您想获得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