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

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

std::atan2允许计算所有四个象限的反正切值。 std::atan只允许计算,如果我记得没错,象限1和4。

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

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

我们根据我们提供给函数的angular度来区分四个象限。 sincostan的符号有以下关系(我们忽略了π/2的确切倍数):

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

由于tan(α)的值是正的,所以我们无法区分,angular度是来自第一象限还是第三象限,如果是负的,它可能来自第二或第四象限。 所以按照惯例, atan()从第一或第四象限(即-π/2 <= atan() <= π/2 atan()返回一个angular度,而不pipe切线的原始input。

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

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

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

这给出了关系

 y/x = tan(α) 

结论: atan(y/x)阻止了一些信息,只能假定input来自第一象限或第四象限。 相反, atan2(y,x)获取所有的数据,从而可以解决正确的angular度。

另外要提的是,当使用像atan(y / x)这样的expression式计算切线时,atan2更稳定,x为0或接近于0。

实际值以弧度表示,但以度为单位来解释:

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

对于涉及导航中的航向和方位等多个angular度计算的工作, atan2大多数情况下是做这个工作的。

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

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

请注意,由于符号含糊不清,函数不能确定angular度在哪个象限下降的正切值(atan alone)。 如果需要确定象限,可以使用atan2。

用atan2你可以确定这里所述的象限。

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

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

c ++ atan2(y,x)将以弧度给我们angle @的值。 如果我们仅仅知道或者对y / x而不是y和x感兴趣,则使用atan。 所以如果p = y / x那么得到@我们将使用atan(p)。

你不能使用atan2来确定象限,只有当你已经知道你在哪个象限的时候才能使用atan2! 尤其是正x和y意味着第一象限,正y和负x,第二等等。 atan或atan2自己只是返回一个正数或负数,只不过是。

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

我想重要的一点是atan只是为了像时间 – 距离vector一样,在右上方的曲线中input正值。 Cero总是在左下angular,而thigs只能上升右移,慢慢或者更快。 atan不会返回负数,所以只能通过加/减其结果来追踪屏幕上的四个方向。

atan2的意思是原点在中间,事情可以倒退或倒退。 这就是你在屏幕表示中使用的东西,因为重要的是你希望曲线走向哪个方向。 所以atan2可以给你负数,因为它的cero在中心,其结果是你可以用来追踪四个方向的东西。

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

如果你正在二维坐标系中工作,这通常是编程反正切的情况下,你应该使用肯定使用atan2。 它将给出完整的2 pi范围的angular度,并为您照顾x坐标中的零点。

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

如果要将笛卡尔坐标转换为极坐标,通常使用atan2(y,x) 。 它会给你的angular度,而sqrt(x*x+y*y)或者如果有的话, hypot(y,x)会给你的大小。

atan(x)只是tan的倒数。 在恼人的情况下,你必须使用atan(y/x)因为你的系统不提供atan2 ,你必须对xy的符号进行额外的检查,对于x=0 ,为了得到正确的angular度。

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