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

yes*_*aaj 137 c++ math.h

atanatan2C++有什么区别?

Meh*_*olf 294

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

tan(?) = sin(?) / cos(?)
Run Code Online (Sandbox Code Playgroud)

我们根据我们提供给功能的角度来区分四个象限.标志sin,costan有以下关系(我们忽略了确切的倍数?/2):

  Quadrant    Angle              sin   cos   tan
-------------------------------------------------
  I           0    < ? < ?/2      +     +     +
  II          ?/2  < ? < ?        +     -     -
  III         ?    < ? < 3?/2     -     -     +
  IV          3?/2 < ? < 2?       -     +     -
Run Code Online (Sandbox Code Playgroud)

鉴于值tan(?)是正的,我们无法区分角度是来自第一或第三象限,如果它是负的,它可能来自第二或第四象限.因此,按照惯例,无论切线的原始输入如何,都会atan()从第一个或第四个象限(即-?/2 <= atan() <= ?/2)返回一个角度.

为了获得完整的信息,我们不能使用除法的结果,sin(?) / cos(?)但我们必须分别查看正弦和余弦的值.这是做什么的atan2().这需要两者的sin(?)cos(?),并通过添加解决所有四个象限?到的结果,atan()每当余弦为负.

备注:atan2(y, x)函数实际上采用a y和a x参数,即在y轴和x轴上具有长度v和角度的向量的投影?,即

y = v * sin(?)
x = v * cos(?)
Run Code Online (Sandbox Code Playgroud)

给出了这种关系

y/x = tan(?)
Run Code Online (Sandbox Code Playgroud)

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

  • 一个小细节,范围`-π/ 2 <= atan()<=π/ 2`实际上包括来自象限II的一个点('pi/2`). (2认同)

Chr*_*ung 112

std::atan2允许计算所有四个象限的反正切值.std::atan只允许从象限1和4计算.


Las*_*lan 24

另外要提到的是,atan2使用类似的表达式计算切线时更稳定,atan(y / x)并且x为0或接近0.

  • 查看http://en.wikipedia.org/wiki/Atan2查看历史和动机部分. (5认同)

Keu*_*eol 23

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

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

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


Rom*_*n M 10

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

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

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

  • atan2(x,y) - > atan2(y,x) (3认同)

ser*_*gio 7

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

我想重要的一点是 atan 仅用于在右上方向曲线中提供正值,例如时间-距离向量。零总是在左下角,thigs 只能向上和向右,只是更慢或更快。atan 不返回负数,因此您无法仅通过添加/减去其结果来在屏幕上的 4 个方向上跟踪事物。

atan2 旨在让原点在中间,事情可以向后或向下。这就是您在屏幕表示中使用的内容,因为您希望曲线走向哪个方向很重要。所以 atan2 可以给你负数,因为它的零在中心,它的结果是你可以用来在 4 个方向上追踪事物的东西。


小智 5

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

C++atan2(y, x)将为我们提供角度 α 的弧度值。 atan如果我们只知道或对 y/x 而不是 y 和 x 单独感兴趣或感兴趣,则使用 。因此,如果 p = y/x 那么为了得到 α,我们将使用atan(p)

您无法使用atan2它来确定象限,atan2只有当您已经知道自己处于哪个象限时才可以使用!特别是正 x 和 y 表示第一象限,正 y 和负 x 表示第二象限,依此类推。atan或者atan2它们本身只是返回一个正数或负数,仅此而已。

  • 如果你只有“p=y/x”,你仍然可以使用“atan2(p,1)”。 (4认同)