Math.atan2() gonna getcha
This might save you an hour of debugging!
In Javascript (and many other languages), the parameters to the Math.atan2()
method are in y, x order.
This is unconventional and can lead to bugs. Conventionally, when referring to x, y (and z) components, we assume them to be in alphabetical order.
To compare this to other trigonometry-related methods, I made a table:
Methods that use y,x order Methods that use x,y order
+ — — — — — — — — — — — — — — - + - — — — — — — — — — — — — — — +
| Math.atan2() | Every other method ever |
+ — — — — — — — — — — — — — — - + - — — — — — — — — — — — — — — +
Of course, someone on StackOverflow has asked why and received many great responses.
The most reasonable explanation is that, when using tangent to describe the angle a of 2d vector xy in mathematical notation, the y component goes on top, like this:
And if you invert that to solve for a, you get:
But we’re still not there, because as you can see above, arctan only takes 1 parameter (the ratio of y to x) and could not possibly know which quadrant the result is in.
So, we use the specialised quadrant-aware version of arctan, namely atan2, which will return a result in the full -180 to 180 degree range. But, the only way atan2 could know which quadrant the result is in, is for it to take the x and y components as independent parameters… so finally, we end up with the familiar method:
atan2(y, x)
To sum up, it kinda makes sense that whoever historically implemented the atan2 method decided to put y first in the parameters list, and then implementors in later languages likely did the same for consistency.
But still… everything else uses x, y 🤷♀️