为什么没有类似atan2()的asin2()和acos2()函数呢?
Why are there no asin2() and acos2() functions similar to atan2()?
根据我的理解,atan2()
函数存在于编程语言中,因为 atan()
本身无法始终确定正确的 theta,因为输出仅限于 -pi/2 到 pi/2.
如果是这样,那么asin()
和acos()
也是同样的问题,两者也有限制范围,那为什么没有asin2()
和acos2()
功能?
首先,请注意两个arctan 函数的语法是atan(y/x)
和atan2(y, x)
。这种区别很重要,因为不执行除法会提供额外的信息,最重要的是 x
和 y
的各个符号。如果您知道单独的 x
和 y
坐标,则可以找到 atan
函数的特定解(即考虑到 (x,y)
所在象限的解).
如果你从 tan(θ) = y/x
到 sin(θ) = y/sqrt(x²+y²)
,那么逆运算 asin
需要 y
和 sqrt(x²+y²)
并结合它们以获得关于角度。在这里,我们自己执行除法还是让某个假设的 asin2
函数处理它并不重要。分母始终为正,因此除法参数包含的信息与单独的分子和分母包含的信息一样多。 (至少在 IEEE 环境中,除以零会导致正确签名的无穷大。)
如果您知道 y
坐标和斜率 sqrt(x²+y²)
那么您就知道角度的正弦值,但您无法知道角度本身,因为您无法区分负值和正值 x
值。同样,如果您知道 x
坐标和斜率,您就会知道角度的余弦值,但无法知道 y
值的符号。
所以asin2
和acos2
在数学上是不可行的,至少不是以明显的方式。如果你将某种符号编码到假设中,情况可能会有所不同,但我想不出这种符号会自然出现的情况。
我会在简单条款中这样解释。
请参阅此图片以获取以下解释:
任务:选择一个函数来跟踪范围内的正确角度 -180 < θ < 180
试验 1:
sin()
在第一象限和第二象限都是正数,sin(30) = sin(150) = 0.5
。使用 sin()
.
跟踪象限变化并不容易
因此asin2()
不可行
试验二:
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()
成为我们的选择。
有时需要像 "acos2" 这样的函数,例如在 3D 中执行矢量旋转时 space。在这种情况下,我对自己的 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 需要相移。 theta不存在这个问题。
因为 asin(y,x)
acos(y,x)
会采用与 atan(y,x)
相同的参数并给出相同的答案。每个都同样有效,但我们只需要一个这样的函数。
(atan2的)名字不明。它是 given x and y, computes the angle
(由从原点到这一点的一条直线)与(正)x 轴的函数。 angle_from(x,y)
这样的名字可以说更合适。
根据我的理解,atan2()
函数存在于编程语言中,因为 atan()
本身无法始终确定正确的 theta,因为输出仅限于 -pi/2 到 pi/2.
如果是这样,那么asin()
和acos()
也是同样的问题,两者也有限制范围,那为什么没有asin2()
和acos2()
功能?
首先,请注意两个arctan 函数的语法是atan(y/x)
和atan2(y, x)
。这种区别很重要,因为不执行除法会提供额外的信息,最重要的是 x
和 y
的各个符号。如果您知道单独的 x
和 y
坐标,则可以找到 atan
函数的特定解(即考虑到 (x,y)
所在象限的解).
如果你从 tan(θ) = y/x
到 sin(θ) = y/sqrt(x²+y²)
,那么逆运算 asin
需要 y
和 sqrt(x²+y²)
并结合它们以获得关于角度。在这里,我们自己执行除法还是让某个假设的 asin2
函数处理它并不重要。分母始终为正,因此除法参数包含的信息与单独的分子和分母包含的信息一样多。 (至少在 IEEE 环境中,除以零会导致正确签名的无穷大。)
如果您知道 y
坐标和斜率 sqrt(x²+y²)
那么您就知道角度的正弦值,但您无法知道角度本身,因为您无法区分负值和正值 x
值。同样,如果您知道 x
坐标和斜率,您就会知道角度的余弦值,但无法知道 y
值的符号。
所以asin2
和acos2
在数学上是不可行的,至少不是以明显的方式。如果你将某种符号编码到假设中,情况可能会有所不同,但我想不出这种符号会自然出现的情况。
我会在简单条款中这样解释。
请参阅此图片以获取以下解释:
任务:选择一个函数来跟踪范围内的正确角度 -180 < θ < 180
试验 1:
sin()
在第一象限和第二象限都是正数,sin(30) = sin(150) = 0.5
。使用 sin()
.
因此asin2()
不可行
试验二:
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()
成为我们的选择。
有时需要像 "acos2" 这样的函数,例如在 3D 中执行矢量旋转时 space。在这种情况下,我对自己的 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 需要相移。 theta不存在这个问题。
因为 asin(y,x)
acos(y,x)
会采用与 atan(y,x)
相同的参数并给出相同的答案。每个都同样有效,但我们只需要一个这样的函数。
(atan2的)名字不明。它是 given x and y, computes the angle
(由从原点到这一点的一条直线)与(正)x 轴的函数。 angle_from(x,y)
这样的名字可以说更合适。