atan
和atan2
C++有什么区别?
从学校数学我们知道切线有定义
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(?)
但我们必须分别查看正弦和余弦的值.这是做什么的atan2()
.这需要两者的sin(?)
和cos(?)
,并通过添加解决所有四个象限?
到的结果,atan()
每当余弦为负.
备注:该atan2(y, x)
函数实际上采用a y
和a x
参数,即在y轴和x轴上具有长度v
和角度的向量的投影?
,即
y = v * sin(?) x = v * cos(?)
给出了这种关系
y/x = tan(?)
结论:
atan(y/x)
阻止了一些信息,只能假设输入来自象限I或IV.相反,atan2(y,x)
获取所有数据,从而可以解决正确的角度.
std::atan2
允许计算所有四个象限的反正切值.std::atan
只允许从象限1和4计算.
另外要提到的是,atan2
使用类似的表达式计算切线时更稳定,atan(y / x)
并且x
为0或接近0.
实际值以弧度为单位,但要以度为单位解释它们将是:
atan
=给出-90到90之间的角度值
atan2
=给出-180和180之间的角度值
对于我的工作涉及各种角度的计算,例如导航中的航向和方位,atan2
在大多数情况下都可以完成工作.
atan(x)返回x的反正切的主值,以弧度表示.
atan2(y,x)返回y/x的反正切的主值,以弧度表示.
请注意,由于符号模糊,函数无法确定角度在哪个象限中仅由其正切值(仅atan)下降.如果需要确定象限,可以使用atan2.