# Find angle between two points, respective to horizontal axis?

I have two points, one is always at the origin (0,0), and the other can be anywhere else in the world. I'd like to find the angle between them, respective to the horizontal axis.

   |     2
|    /
|   /
|  /
| /
|/ a
---1-------------- (horizontal axis)
|

a = angle (~50 degrees, counter clockwise)


In the above I would construct a right triangle and use sohcahtoa to figure out the missing angle I want, but it gets a bit ugly when the second point is in a different quadrant like in this case:

2    |
\    |
\   |
\  |
\a|a
\|a
---1--------------
|
|

a = angle (~135, counter clockwise)


I just end up with a bunch of different cases depending on what quadrant the second point is in. I'm thinking there must be a much simpler, general solution. This is kind of like trying to find the angle between a point on the edge of a circle and its center, respective to the origin's horizontal axis.

I'm using a C-like language, and it has an atan2() function available. I think these mostly work the same way, would I just feed it the x, y coordinate of my second point and I get back that angle in radians?

Thank you

• Yes, two-argument arctangent is intended precisely for your situation. You didn't specify what specific language you have, so: check the docs to see whether it takes the vertical coordinate $y$ first (atan2(y,x)) or the horizontal coordinate $x$ first (atan2(x,y)). – J. M. is a poor mathematician Oct 20 '11 at 4:24
• One thing is generally agreed upon for two-argument arctangent: the angles (in radians) returned are within the interval $(-\pi,\pi]$. – J. M. is a poor mathematician Oct 20 '11 at 4:25
• Hey, yes using java and it wants atan(y,x). Question though - are there any special cases I need to worry about for input? Like if x or y equal zero? A return value in [−π,π] is fine I think - it'll just convert to +180 / -180, right? My rendering framework can handle that ok. Thanks! – wwww Oct 20 '11 at 4:28
• atan2() is also designed to handle the case where one of the coordinates is zero. I haven't checked how atan2(0,0) evaluates in Java, but it's indeterminate (NaN) in some systems and zero in other systems. If you need results in degrees, just perform the usual conversions. – J. M. is a poor mathematician Oct 20 '11 at 4:30
• @wwww: What I don't understand: Why did you go to all the trouble of writing down this question and creating those ASCII diagrams when you already knew about the atan2 function and could have just tried it out to check whether it does what you want? – joriki Oct 20 '11 at 6:52

Yes, two-argument arctangent is intended precisely for your situation. You didn't specify what specific language you have, so: check the docs to see whether it takes the vertical coordinate y first (atan2(y,x)) or the horizontal coordinate x first (atan2(x,y)). One thing is generally agreed upon for two-argument arctangent: the angles (in radians) returned are within the interval (−π,π]

atan2() is also designed to handle the case where one of the coordinates is zero. I haven't checked how atan2(0,0) evaluates in Java, but it's indeterminate (NaN) in some systems and zero in other systems. If you need results in degrees, just perform the usual conversions

Cite: J.M

Get distance between two points:
LENGTH = sqrt[(X1 - X2)2 + (Y1 - Y2)2]

Then get angle: ANGLE = cos-1[(X2-X1)/LENGTH]

If Y1 > Y2 then
ANGLE = 2PI - ANGLE

where 2PI is 360 degrees