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先出现。
这里有一个很棒的链接,谈论了一些关于它的内容:Angles and Directions。
我一直认为这是由于三角函数的定义,也就是说
tan(theta) = opposite / adjacent
当使用原点的正角度时,对边始终是Y轴,临边始终是X轴,因此:
atan2(opposite, adjacent) = theta
也就是说,这样做是为了避免与数学定义相关的排序混乱。
这是因为在学校中,计算梯度的助记符是上升/前进,或者换句话说是dy/dx,更简洁地说就是y/x。
这个顺序已经悄悄地进入了反正切函数的参数中。
所以这是一个历史文物。对我来说,这取决于我使用atan2
时正在思考什么。如果我在考虑微分,我就能理解它,如果我在考虑坐标对,我就会错误地使用它。
在Excel中,顺序是atan2(X,Y),所以我认为反向顺序是一种编程技巧。将atan(Y/X)轻松更改为atan2(Y,X),只需在“n”和“(”之间放置一个“2”,并用“,”替换“/”,仅需两个操作。相反的顺序需要4个操作,并且其中一些操作会更加复杂(剪切和粘贴)。
我经常在Excel中计算数学问题,然后将其移植到.NET,因此有时会卡在atan2上。最好能够统一规范atan2的使用方式。
如果 atan2 的参数顺序被颠倒,那将更加方便。这样,在计算极角时就不需要担心翻转参数了。Mathematica 的等效函数就是这样做的:https://reference.wolfram.com/language/ref/ArcTan.html
早在 FORTRAN 时代,就有一个 ATAN2 函数,其参数顺序不太方便,在 this reference manual 中被(有些不准确地)描述为 arctan(arg1 / arg2)。
初期创建者可能固执于 atan2(arg1, arg2) 是(或多或少是)arctan(arg1 / arg2),并且这个决定被盲目地从 FORTRAN 复制到了 C、C++、Python、Java 和 JavaScript 中。
Atan2()
函数,当时并不知道任何惯例(我认为我发明了切片面包),所以我将参数设为(x,y)
。从那时起,我总是搞混参数的顺序。也许提问者有类似的经历。这完全取决于你熟悉什么。 - John Alexiou