calculate the angle between a line and x-axis
If you have two points, (x0, y0)
and (x1, y1)
, then the angle of the line joining them (relative to the X axis) is given by:
theta = atan2((y1 - y0), (x1 - x0))
Calculating the angle between a line and the x-axis
Assumptions: x
is the horizontal axis, and increases when moving from left to right.y
is the vertical axis, and increases from bottom to top. (touch_x, touch_y)
is the
point selected by the user. (center_x, center_y)
is the point at the center of the
screen. theta
is measured counter-clockwise from the +x
axis. Then:
delta_x = touch_x - center_x
delta_y = touch_y - center_y
theta_radians = atan2(delta_y, delta_x)
Edit: you mentioned in a comment that y increases from top to bottom. In that
case,
delta_y = center_y - touch_y
But it would be more correct to describe this as expressing (touch_x, touch_y)
in polar coordinates relative to (center_x, center_y)
. As ChrisF mentioned,
the idea of taking an "angle between two points" is not well defined.
How to calculate the angle between a line and the horizontal axis?
First find the difference between the start point and the end point (here, this is more of a directed line segment, not a "line", since lines extend infinitely and don't start at a particular point).
deltaY = P2_y - P1_y
deltaX = P2_x - P1_x
Then calculate the angle (which runs from the positive X axis at P1
to the positive Y axis at P1
).
angleInDegrees = arctan(deltaY / deltaX) * 180 / PI
But arctan
may not be ideal, because dividing the differences this way will erase the distinction needed to distinguish which quadrant the angle is in (see below). Use the following instead if your language includes an atan2
function:
angleInDegrees = atan2(deltaY, deltaX) * 180 / PI
EDIT (Feb. 22, 2017): In general, however, calling atan2(deltaY,deltaX)
just to get the proper angle for cos
and sin
may be inelegant. In those cases, you can often do the following instead:
- Treat
(deltaX, deltaY)
as a vector. - Normalize that vector to a unit vector. To do so, divide
deltaX
anddeltaY
by the vector's length (sqrt(deltaX*deltaX+deltaY*deltaY)
), unless the length is 0. - After that,
deltaX
will now be the cosine of the angle between the vector and the horizontal axis (in the direction from the positive X to the positive Y axis atP1
). - And
deltaY
will now be the sine of that angle. - If the vector's length is 0, it won't have an angle between it and the horizontal axis (so it won't have a meaningful sine and cosine).
EDIT (Feb. 28, 2017): Even without normalizing (deltaX, deltaY)
:
- The sign of
deltaX
will tell you whether the cosine described in step 3 is positive or negative. - The sign of
deltaY
will tell you whether the sine described in step 4 is positive or negative. - The signs of
deltaX
anddeltaY
will tell you which quadrant the angle is in, in relation to the positive X axis atP1
:+deltaX
,+deltaY
: 0 to 90 degrees.-deltaX
,+deltaY
: 90 to 180 degrees.-deltaX
,-deltaY
: 180 to 270 degrees (-180 to -90 degrees).+deltaX
,-deltaY
: 270 to 360 degrees (-90 to 0 degrees).
An implementation in Python using radians (provided on July 19, 2015 by Eric Leschinski, who edited my answer):
from math import *
def angle_trunc(a):
while a < 0.0:
a += pi * 2
return a
def getAngleBetweenPoints(x_orig, y_orig, x_landmark, y_landmark):
deltaY = y_landmark - y_orig
deltaX = x_landmark - x_orig
return angle_trunc(atan2(deltaY, deltaX))
angle = getAngleBetweenPoints(5, 2, 1,4)
assert angle >= 0, "angle must be >= 0"
angle = getAngleBetweenPoints(1, 1, 2, 1)
assert angle == 0, "expecting angle to be 0"
angle = getAngleBetweenPoints(2, 1, 1, 1)
assert abs(pi - angle) <= 0.01, "expecting angle to be pi, it is: " + str(angle)
angle = getAngleBetweenPoints(2, 1, 2, 3)
assert abs(angle - pi/2) <= 0.01, "expecting angle to be pi/2, it is: " + str(angle)
angle = getAngleBetweenPoints(2, 1, 2, 0)
assert abs(angle - (pi+pi/2)) <= 0.01, "expecting angle to be pi+pi/2, it is: " + str(angle)
angle = getAngleBetweenPoints(1, 1, 2, 2)
assert abs(angle - (pi/4)) <= 0.01, "expecting angle to be pi/4, it is: " + str(angle)
angle = getAngleBetweenPoints(-1, -1, -2, -2)
assert abs(angle - (pi+pi/4)) <= 0.01, "expecting angle to be pi+pi/4, it is: " + str(angle)
angle = getAngleBetweenPoints(-1, -1, -1, 2)
assert abs(angle - (pi/2)) <= 0.01, "expecting angle to be pi/2, it is: " + str(angle)
All tests pass. See https://en.wikipedia.org/wiki/Unit_circle
calculate angle between horizontal axis and two points
I'm going to assume that your longitudinal coordinates represent the distance of each point along the x-axis and that your latitudinal coordinates represent the distance of each point along the y-axis. If this is an incorrect assumption let me know.
y
| (B)
| /|
| / |
| / |
| distance(AB) / |
| / | (LatB-LatA)
| / |
| / |
| / |
| /alpha |
| (A)----------
| (LonB-LonA)
|
|
|__________________________________ x
0
Then, in order to find your angle relative to the x-axis, you should apply one of the following rules:
sin(alpha) = (LatB - LatA) / distance(AB)
cos(alpha) = (LonB - LonA) / distance(AB)
tan(alpha) = (LatB - LatA) / (LonB - LonA)
By simply rearranging one of the equations by using the inverse of sin
, cos
, or tan
, you should be able to find alpha
in radians. For example...
alpha = Math.Asin((LatB - LatA) / distance(AB));
alpha = Math.Acos((LonB - LonA) / distance(AB));
alpha = Math.Atan((LatB - LatA) / (LonB - LonA));
Find angle between two points, respective to horizontal axis?
Most programming languages/APIs provide a function, atan2()
, which finds the angle and takes the quadrant into consideration. Just use that.
Find the angle between a line segment and the y axis in Python
You need the atan2 function from the math module:
from math import atan2,pi
atan2(y,x)*180/pi # in degrees, positive angles are counter clockwise
for x in range (-1,2):
for y in range(-1,2):
print((x,y),atan2(y,x)*180/pi)
(-1, -1) -135.0
(-1, 0) 180.0
(-1, 1) 135.0
(0, -1) -90.0
(0, 0) 0.0
(0, 1) 90.0
(1, -1) -45.0
(1, 0) 0.0
(1, 1) 45.0
How to find angle of point from x-axis independant of quadrant?
Use Math.atan2()
because it returns a value from 0->180 in the first two quadrants and -180->0 in the last 2.
Get angle from Horizontal and Vertical Axis
If you want to get the angle of a Vector, use the Vector2.SignedAngle()
:
var inputAngle = Vector2.SignedAngle(Vector2.right, inputVector);
Angles are relative, which is why you need to specify Vector2.right
as the first parameter. There's also a Vector2.Angle()
method, but that just returns the distance between two angles, and doesn't take into account the direction.
If you need to verify that your input vectors are what you think they are, use Debug.Log()
to print your inputVector
.
Line Equation with angle
An equation of a line is like:
m*x + n = y
m can be calculated by angle; m = tan(angle)
And if you know a start point then you can find n.
tan(angle) * startPoint_X + n = startPoint_Y
So n = startPoint_Y - (tan ( angle) * startPoint_X )
If you want to draw a line-segment and you know the length, the start point and the angle, there will be two equations.
The first is m*x + n = y
(we solved it).
And this means m*(endPoint_X) + n = endPoint_Y
The second is to find the endPoint.
length^2 = (endPoint_X - startPoint_X)^2 + (endPoint_Y - startPoint_Y)^2
There are only two things that still we don't know: endPoint_x & endPoint_Y
If we rewrite the equation:
length^2 = (endPoint_X - startPoint_X)^2 + ( m*(endPoint_X) + n - startPoint_Y)^2
now we know everything except endPoint_X.
This equation will give us two solutions for endPoint_X.
Then you can find two different ednPoint_Y.
Related Topics
Kill Some Processes by .Exe File Name
How Does the Ternary Operator Work
Import CSV File to Strongly Typed Data Structure in .Net
C# "Parameter Is Not Valid." Creating New Bitmap
Return View as String in .Net Core
C# Export Private/Public Rsa Key from Rsacryptoserviceprovider to Pem String
Linq to Entities Does Not Recognize the Method Last. Really
Are Static Class Instances Unique to a Request or a Server in ASP.NET
ASP.NET MVC Razor Pass Model to Layout
Updating Gui (Wpf) Using a Different Thread
Howto Implement Callback Interface from Unmanaged Dll to .Net App
Is Shifting Bits Faster Than Multiplying and Dividing in Java? .Net
How to Handle Key Press Event in Console Application
Change Desktop Wallpaper Using Code in .Net
Replace First Occurrence of Pattern in a String