Math.atan2() gonna getcha

Joel Malone
2 min readOct 27, 2022
Photo by imdadul hussain on Unsplash

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 🤷‍♀️

--

--

Joel Malone

Software Engineer living in Southwest Western Australia