在 C 语言中,atan2 函数具有以下签名:
double atan2( double y, double x );
其他语言也这样做。这是我所知道的唯一一个以 Y,X 顺序而不是 X,Y 顺序获取参数的函数,它经常把我搞砸,因为当我想到坐标时,我想到 (X,Y)。
有谁知道为什么atan2的参数顺序约定是这样的吗?
因为和arctan(y/x)有关,所以y先出现。
这里有一个很好的链接,对此进行了一些讨论:角度和方向
我一直认为这是因为三角函数定义,即
tan(theta) = opposite / adjacent
当使用从原点开始的正则角时,对面始终是 Y,相邻始终是 X,因此:
atan2(opposite, adjacent) = theta
也就是说,它是这样完成的,因此在数学定义方面不会出现顺序混乱。
假设有一个矩形三角形,其对边称为 y,邻边称为 x:
tan(角度) = y/x
arctan(tan(角度)) = arctan(y/x)
因为在学校里,计算梯度的助记符
是上升超过运行,或者换句话说dy/dx,或者更简单地说是y/x。
这个顺序已经潜入反正切函数的参数中。
所以这是一件历史文物。对我来说这取决于我的想法
关于我何时使用
atan2
。如果我考虑差异,我就猜对了Excel中的顺序是atan2(X,Y),所以我认为相反的顺序是一个编程问题。 通过在“n”和“(”之间放置“2”,并将“/”替换为“,”,只需 2 次操作,即可轻松将 atan(Y/X) 更改为 atan2(Y,X)。相反的顺序需要 4 次操作,并且某些操作会更复杂(剪切和粘贴)。
我经常在 Excel 中计算出数学结果,然后将其移植到 .NET,因此有时会沉迷于 atan2。 如果 atan2 能够以一种或另一种方式标准化那就最好了。
如果atan2的参数颠倒过来会更方便。这样您就无需担心在计算极角时翻转参数。 Mathematica 的等效项就是这样做的:https://reference.wolfram.com/language/ref/ArcTan.html
早在很早以前,FORTRAN 就有一个 ATAN2 函数,其参数顺序不太方便,在 本参考手册 中,(有点不准确)被描述为 arctan(arg1 / arg2)。
最初的创建者可能专注于 atan2(arg1, arg2)(或多或少)arctan(arg1 / arg2),并且该决定被盲目地从 FORTRAN 复制到 C、C++、Python、Java 和 JavaScript。
在 FortranII 的 IBM doco 中,一个或多个参数始终称为 Arg1(和 Arg2)。这是当时的大会。在 1958 年的 Fortran II 手册(文档 C2-6000-1)中,捆绑反正切例程称为 ARCTANF(Arg1)。同年晚些时候发布的 C28-6000-2 版本将其重命名为 ATANF(Arg1)(我相信内部结构已被替换)。 1961 年,如前所述,带有两个参数(当时约定为 Arg1 和 Arg2)的新例程出现在已发布的 IBM 文档中。至少对于Arg1和Arg2均为正的情况,相当于之前的ATANF(Arg1/Arg2)的值。这是一个简单的推断,并且很有意义,因为在完成时还没有复杂的变量。当您看到那些写为 Y 和 X 的参数时,有些人似乎会感到困惑,但 Arg1 和 Arg2 约定不会发生这种情况。当时,它甚至不被视为 Fortran 内在函数。