How to convert x,y coordinates to an angle?
If you get deltaX
and deltaY
from your coordinates then Math.atan2
returns the arctangent of the quotient of its arguments. The return value is in radians.
var deltaX = x2 - x1;
var deltaY = y2 - y1;
var rad = Math.atan2(deltaY, deltaX); // In radians
Then you can convert it to degrees as easy as:
var deg = rad * (180 / Math.PI)
Edit
There was some bugs in my initial answer. I believe in the updated answer all bugs are addressed. Please comment here if you think there is a problem here.
Calculate degrees of angle using x, y coordinates
Showing us the code returning the wrong result would reveal us where the problem is and allow us to give you more specific advice.
Since you want the angle relative to the center, you must subtract the center coordinates from your points.
Math.Atan2
yields radians. Convert them to degrees withdegrees = radians * 180 / pi
.Your zero angle is not as usual on the x-axis, but on the y-axis. Add 90 degrees to make the correction.
Using a vector type makes things easier. Here I will be using the System.Numerics.Vector2
struct.
As Patrick McDonald pointed out, Atan2 might yield negative results in some cases. By adding 450 degrees (360 + our 90 degrees correction) to the result and taking this modulo 360 degrees, you always get a value between 0 and 360.
public static float GetAngle(Vector2 point, Vector2 center)
{
Vector2 relPoint = point - center;
return (ToDegrees(MathF.Atan2(relPoint.Y, relPoint.X)) + 450f) % 360f;
}
public static float ToDegrees(float radians) => radians * 180f / MathF.PI;
The test
var a = new Vector2(7, 3);
var b = new Vector2(20, 7);
var c = new Vector2(7, 10);
var d = new Vector2(3, 7);
var e = new Vector2(6.9f, 3); // Test for more than 270 deg.
var f = new Vector2(7.1f, 3); // Test for small angle.
var center = new Vector2(7, 7);
PrintAngle(a); // ==> 0
PrintAngle(b); // ==> 90
PrintAngle(c); // ==> 180
PrintAngle(d); // ==> 270
PrintAngle(e); // ==> 358.5679
PrintAngle(f); // ==> 1.432098
void PrintAngle(Vector2 point)
{
Console.WriteLine(GetAngle(point, center));
}
Convert X,Y to angle
I'm not really sure what are you trying to achieve, but isn't it easier to just use the atan2 function to get an angle?
http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#atan2(double, double)
If you are not familiar with the function you can read here:
http://en.wikipedia.org/wiki/Atan2
Edit, code example:
So, here is some code I think that is useful, after the discussion
public static double getAngle(int x, int y)
{
return 1.5 * Math.PI - Math.atan2(y,x); //note the atan2 call, the order of paramers is y then x
}
Basically, it calculates an angle between the negative Y-axis with the positive clockwise direction. I hope that is what you have been looking for.
Convert x and y to angle in radians
You have x < 0
and y/x = -1.036811 < 0
. Now, it means theta can only be in 2nd or 4th quadrant.
Let tan(-z)=-tan(z)=tan(2*pi-z)=tan(pi-z)=w
, then -z
, pi-z
, 2*pi-z
all equals atan(w)
, the solution is not unique in z
.
atan(y/x)
#[1] -0.8034692
-0.8034692 is a solution means
pi+atan(y/x)
#[1] 2.338123
and
2*pi+atan(y/x)
#[1] 5.479716
are solutions as well.
c(tan(atan(y/x)), tan(pi+atan(y/x)), tan(2*pi+atan(y/x)))
# [1] -1.036811 -1.036811 -1.036811
If we are interested to find solution 0<theta<pi
then the only candidate solution is pi+atan(y/x)=2.338123
Calculate x/y Coordinates from Angle for every Point
This is a simple maths question, not a Swift question.
let circle = 2.0 * Double.pi
for angle in stride(from: 0.0, to: circle, by: circle / 28.0) {
let x = radius * cos(angle)
let y = radius * sin(angle)
// Add x & y to the coordinates of your centre.
}
x, y direction to degree
Depending on what 'North' means, i.e. along which axis, and what direction the angles are supposed to go, the following code should be a solution to your problem:
math.atan2(y,x)/math.pi*180
This gives you the angle of a point(x,y) from the origin, counter-clockwise with 'North' along the x-axis.
Robust atan(y,x) on GLSL for converting XY coordinate to angle
I'm going to answer my own question to share my knowledge. We first notice that the instability happens when x
is near zero. However, we can also translate that as abs(x) << abs(y)
. So first we divide the plane (assuming we are on a unit circle) into two regions: one where |x| <= |y|
and another where |x| > |y|
, as shown below:
We know that atan(x,y)
is much more stable in the green region -- when x is close to zero we simply have something close to atan(0.0) which is very stable numerically, while the usual atan(y,x)
is more stable in the orange region. You can also convince yourself that this relationship:
atan(x,y) = PI/2 - atan(y,x)
holds for all non-origin (x,y), where it is undefined, and we are talking about atan(y,x)
that is able to return angle value in the entire range of -PI,PI, not atan(y_over_x)
which only returns angle between -PI/2, PI/2. Therefore, our robust atan2()
routine for GLSL is quite simple:
float atan2(in float y, in float x)
{
bool s = (abs(x) > abs(y));
return mix(PI/2.0 - atan(x,y), atan(y,x), s);
}
As a side note, the identity for mathematical function atan(x)
is actually:
atan(x) + atan(1/x) = sgn(x) * PI/2
which is true because its range is (-PI/2, PI/2).
Given an angle and length, how do I calculate the coordinates
// edit to add conversion
#define radian2degree(a) (a * 57.295779513082)
#define degree2radian(a) (a * 0.017453292519)
x = start_x + len * cos(angle);
y = start_y + len * sin(angle);
Calculating direction angle from x and y speed
Math libraries usually come with a function called atan2
just for this purpose:
double angle = atan2(y, x);
The angle is measured in radians; multiply by 180/PI to convert to degrees. The range of the angle is from -pi to pi. The 0-angle is the positive x-axis and the angle grows clockwise. Minor changes are needed if you want some other configuration, like the 0-angle being the negative y-axis and the range going from 0 to 359.99 degrees.
The main reason to use atan2
instead of atan
or any of the other inverse trig functions is because it determines the correct quadrant of the angle for you, and you don't need to do it yourself with a series of if
-statements.
python convert degrees to change in x and change in y
import math
speed = 5
angle = math.radians(90) # Remember to convert to radians!
change = [speed * math.cos(angle), speed * math.sin(angle)]
Related Topics
Make a <Br> Instead of <Div></Div> by Pressing Enter on a Contenteditable
JavaScript Click Event Listener on Multiple Elements and Get Target Id
Impossible to Hide Navigation Bars in Safari iOS 7 for Iphone/Ipod Touch
How to Append a CSS Class to an Element by JavaScript
Capture/Save/Export an Image with CSS Filter Effects Applied
How to Create and Apply CSS to JavaScript Alert
Use CSS (And Maybe JavaScript) to Make an Element Be Square (Or Maintain a Specific Aspect Ratio)
How to Position a React Component Relative to Its Parent
Adding to Script Bundle from Partial View in .Net MVC 5
How to Add !Important to a Stylesheet Rule Using JavaScript
Jquery Move Div with Arrow Keys
How to Color Specific Letters in HTML Element Text
How to Animate the Opacity of the Background of a Div
How to Make a Rotated Element Height:100% of Its Parent