29

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

double atan2( double y, double x );

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

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

4

6 回答 6

28

因为我相信它与 arctan(y/x) 有关,所以 y 出现在顶部。

这是一个很好的链接:角度和方向

于 2009-06-25T19:01:58.413 回答
12

我的假设一直是这是因为三角定义,即

tan(theta) = opposite / adjacent

当使用从原点开始的规范角时,对面总是 Y,相邻总是 X,所以:

atan2(opposite, adjacent) = theta

即,它是这样做的,因此在数学定义方面没有排序混淆。

于 2009-06-25T19:04:48.500 回答
1

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

tan(角度) = y/x

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

于 2009-06-25T19:06:55.703 回答
1

这是因为在学校里,计算梯度的助记符
rise over run,或者说是dy/dx,或者更简单的说是y/x。

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

所以这是一件历史文物。对我来说,这取决于我在
使用atan2. 如果我在考虑微分,我是对的
,如果我在考虑坐标对,我就错了。

于 2009-06-25T19:38:04.783 回答
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,这似乎是合理的。

于 2020-04-21T14:03:22.707 回答
0

excel中的顺序是atan2(X,Y)所以我认为相反的顺序是编程的事情。atan(Y/X) 可以很容易地更改为 atan2(Y,X),方法是在 'n' 和 '(' 之间放置一个 '2',并将 '/' 替换为 ',',只需 2 次操作。相反的顺序需要 4 次操作,其中一些操作会更复杂(剪切和粘贴)。

我经常在 Excel 中计算数学,然后将其移植到 .NET,因此有时会挂断在 atan2 上。如果 atan2 可以以一种或另一种方式标准化,那将是最好的。

于 2019-08-27T22:58:16.250 回答