根据我的理解,atan2()
函数存在于编程语言中,因为atan()
本身不能总是确定正确的θ,因为输出被限制为-pi / 2到pi / 2。
如果是这种情况,那么同样的问题同时适用于asin()
和acos()
,两者都有限制范围,那么为什么没有asin2()
和{{ 1}}函数?
答案 0 :(得分:9)
首先请注意,语法为atan(y/x)
但atan2(y, x)
,而不是atan2(y/x)
。这一点很重要,因为如果不执行该部门,则会提供其他信息,最重要的是x
和y
的个别信号。如果您分别知道x
和y
坐标,则可以知道角度,包括象限。
如果您从tan(θ) = y/x
转到sin(θ) = y/sqrt(x²+y²)
,则反向操作asin
需要y
和sqrt(x²+y²)
并将其组合以获取有关角度的一些信息。在这里,我们是自己执行除法还是让一些假设的asin2
函数处理它并不重要。分母总是正的,因此分割的参数包含与单独的分子和分母包含的信息一样多的信息。 (至少在IEEE环境中,除以零会导致正确签名的无穷大。)
如果您知道y
坐标和斜角sqrt(x²+y²)
,那么您就知道角度的正弦,但您无法知道角度本身,因为您无法区分负面和正面{{1} }值。同样,如果你知道x
坐标和hypothenuse,你知道角度的余弦,但你不知道x
值的符号。
所以y
和asin2
在数学上是不可行的,至少不是以明显的方式。如果你将某种符号编码到连字符中,事情可能会有所不同,但我认为这种符号不会自然出现。
答案 1 :(得分:0)
我将在简单条款中进行解释。 See this image进行以下解释。
任务:选择一个可以在-180 < θ < 180
范围内跟踪正确角度的函数
审判1:
sin()
在第一象限和第二象限sin(30) = sin(150) = 0.5
中为正。使用sin()
来跟踪象限变化并不容易。
因此,asin2()
不可行。
试用2:
cos()
在第一和第四象限cos(60) = sin(300) = 0.5
中为正。此外,使用cos()
来跟踪象限变化也不容易。
因此,acos2()
也不可行。
试验3:
tan()
在第一象限和第三象限中为正,并且以有趣的顺序排列。
在第一象限为正,在第二象限为负,在第三象限为正,在第四象限为负,在环绕的第一象限为正。
这样tan(45) = 1
,tan(135) = -1
,tan(225) = 1
,tan(315) = -1
和tan(360+45) = 1
。欢呼!我们可以跟踪象限的变化。
请注意,明确范围是-180 < θ < 180
。另外,请注意上面的45度增量示例,如果序列为1,-1,..
,则角度为逆时针方向;如果序列为-1,1,..
,则角度为顺时针方向。这个想法应该解决方向性。
因此,atan2()
成为我们的选择。
答案 2 :(得分:0)
有时需要例如“ acos2”的功能,例如在3D空间中执行矢量旋转时。在这种情况下,我对自己的acos2函数进行了硬编码,该函数仅执行以下检查:
x_perp=sqrt(x*x+y*y)
r=sqrt(x*x+y*y+z*z)
if(x_perp.gt.0.0d0) then
phi=acos(x/x_perp)
else
phi=0.0d0
endif
if(y.lt.0.0d0) phi=2.0d0*pi-phi
theta=acos(z/r)
其中theta和phi是通常的球坐标,而x,y,z是笛卡尔坐标。当y为负数时,会出现问题,需要在phi中进行相移。 θ没有这样的问题。
答案 3 :(得分:0)
因为asin(y,x)
acos(y,x)
将分别使用与atan(y,x)
相同的参数,并且将给出相同的答案。每个函数都同样有效,但是我们只需要一个这样的函数。
不确定性源自(atan2)的名称。它的功能是given x and y, computes the angle
(由原点到该点的直线制成)的x轴为正。像angle_from(x,y)
这样的名称可能更合适。