为什么atan2的参数是Y,X而不是X,Y?

问题描述 投票:0回答:7

在 C 语言中,atan2 函数具有以下签名:

double atan2( double y, double x );

其他语言也这样做。这是我所知道的唯一一个以 Y,X 顺序而不是 X,Y 顺序获取参数的函数,它经常把我搞砸,因为当我想到坐标时,我想到 (X,Y)。

有谁知道为什么atan2的参数顺序约定是这样的吗?

math arguments conventions
7个回答
31
投票

因为和arctan(y/x)有关,所以y先出现。

这里有一个很好的链接,对此进行了一些讨论:角度和方向


13
投票

我一直认为这是因为三角函数定义,即

tan(theta) = opposite / adjacent

当使用从原点开始的正则角时,对面始终是 Y,相邻始终是 X,因此:

atan2(opposite, adjacent) = theta

也就是说,它是这样完成的,因此在数学定义方面不会出现顺序混乱。


1
投票

假设有一个矩形三角形,其对边称为 y,邻边称为 x:

tan(角度) = y/x

arctan(tan(角度)) = arctan(y/x)


1
投票

因为在学校里,计算梯度的助记符
上升超过运行,或者换句话说dy/dx,或者更简单地说是y/x。

这个顺序已经潜入反正切函数的参数中。

所以这是一件历史文物。对我来说这取决于我的想法
关于我何时使用

atan2
。如果我考虑差异,我就猜对了
如果我考虑的是坐标对,我就错了。


1
投票

Excel中的顺序是atan2(X,Y),所以我认为相反的顺序是一个编程问题。 通过在“n”和“(”之间放置“2”,并将“/”替换为“,”,只需 2 次操作,即可轻松将 atan(Y/X) 更改为 atan2(Y,X)。相反的顺序需要 4 次操作,并且某些操作会更复杂(剪切和粘贴)。

我经常在 Excel 中计算出数学结果,然后将其移植到 .NET,因此有时会沉迷于 atan2。 如果 atan2 能够以一种或另一种方式标准化那就最好了。


0
投票

如果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。


0
投票

在 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 内在函数。

© www.soinside.com 2019 - 2024. All rights reserved.