在 C 中,atan2 函数具有以下签名:
double atan2( double y, double x );
其他语言也这样做。这是我所知道的唯一一个以 Y,X 顺序而不是 X,Y 顺序接受参数的函数,它经常把我搞砸,因为当我考虑坐标时,我认为是 (X,Y)。
有谁知道为什么 atan2 的参数顺序约定是这样的?
在 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)
这是因为在学校里,计算梯度的助记符
是rise over run,或者说是dy/dx,或者更简单的说是y/x。
这个顺序已经潜入反正切函数的参数中。
所以这是一件历史文物。对我来说,这取决于我在
使用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,这似乎是合理的。
excel中的顺序是atan2(X,Y)所以我认为相反的顺序是编程的事情。atan(Y/X) 可以很容易地更改为 atan2(Y,X),方法是在 'n' 和 '(' 之间放置一个 '2',并将 '/' 替换为 ',',只需 2 次操作。相反的顺序需要 4 次操作,其中一些操作会更复杂(剪切和粘贴)。
我经常在 Excel 中计算数学,然后将其移植到 .NET,因此有时会挂断在 atan2 上。如果 atan2 可以以一种或另一种方式标准化,那将是最好的。