7

This might have been answered before, sorry if it has. I basically need to get the angle from origin to point. So lets say Origin is (0, 0) and my target point is (3, 0).

3 O'clock = 90 degrees

6 O'clock = 180 degrees

9 O'clock = 270 degrees

12 O'clock = 0 degrees


Somehow, I gotta do some math magic, and find out that the angle is 90 degrees (Top is 0). The origin can vary, so I need a method with two parameters, Origin, and TargetPoint, which returns double Angle in Degrees.

Yea, I realize this looks short and nonconstructive, but I made the question as simple and understandable as possible. All the other questions were closed -.-

Thanks

Dave
  • 549
  • 1
  • 7
  • 19
  • 3
    An angle is between two lines... not two points, unless you're talking of the angle of a line compare to say, the world itself? Also... is this for a homework? – LightStriker Jul 08 '13 at 15:15
  • No, I need the angle between origin and a point. Think of it as a clock, 3 O'clock is 90 degrees about Origin (center). No, I'm working on a game. – Dave Jul 08 '13 at 15:16
  • 2
    @LightStriker Why do people have so much trouble understanding this question? Of **COURSE** you can't _technically_ have an angle between two points, but why is it so hard to understand that a lot of programmers haven't been taught this? All they know is they 0 degrees is up and they need to find an angle that will make one sprite point at another sprite. Most programmers that ask this question simply don't have the maths background to grasp the concept of needing three points (or two lines, if you like) for an angle. [/rant] – Clonkex May 28 '14 at 13:07

4 Answers4

12

The vector between two points A and B is B-A = (B.x-A.x, B.y-A.y). The angle between two vectors can be calculated with the dot product or atan2.

var vector2 = Target - Origin;
var vector1 = new Point(0, 1) // 12 o'clock == 0°, assuming that y goes from bottom to top

double angleInRadians = Math.Atan2(vector2.Y, vector2.X) - Math.Atan2(vector1.Y, vector1.X);

See also Finding Signed Angle Between Vectors

Community
  • 1
  • 1
Sebastian Negraszus
  • 11,057
  • 7
  • 38
  • 66
  • 1
    So: `Math.Atan2(Origin.Y - Target.Y, Origin.X - Target.X);`? And this is Radians, right? – Dave Jul 08 '13 at 15:18
  • @user2544245: You need **two** vectors. The second vector points into the direction that you want to represent 0°. Clockwise, yes. Your formula is wrong, though. – Sebastian Negraszus Jul 08 '13 at 15:27
  • In your formula, does it matter which one is Origin and which is Target? – Dave Jul 08 '13 at 15:29
  • @user2544245: Your question does not make sense. You need **two** vectors! One of them is derived from Origin **and** Target, the other from the direction of your 0° vector. – Sebastian Negraszus Jul 08 '13 at 15:32
  • Also, how can I get a *point* from **Origin** using an **Angle in Radians** and a **Length**. Or.. Should I make a new question for it? – Dave Jul 08 '13 at 15:37
  • @user2544245: x = Length*cos(angle); y= Length*sin(angle) – Sebastian Negraszus Jul 08 '13 at 15:38
  • And if my Origin is not **(0, 0)**, then I just do: `((Length * Cos(angle)) + Origin.X, (Length * Sin(angle)) + Origin.Y)`? – Dave Jul 08 '13 at 15:39
1

Assuming x is positive, something like this:

angle = Math.Atan(y / x) * 180 / Math.PI + 90

Edited to allow for negative x values:

If it can be negative, just do it by case. Something like this:

if (x < 0) {
    angle = 270 - (Math.Atan(y / -x) * 180 / Math.PI);
} else {
    angle = 90 + (Math.Atan(y / x) * 180 / Math.PI);
}
mirabilos
  • 4,473
  • 2
  • 42
  • 65
0
public static double GetAngleDegree(Point origin, Point target) {
    var n = 270 - (Math.Atan2(origin.Y - target.Y, origin.X - target.X)) * 180 / Math.PI;
    return n % 360;
}

static void Main(string[] args)
{
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, 3)));//0
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(3, 0)));//90
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, -3)));//180
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(-3, 0)));//270 
}
Ahmed KRAIEM
  • 9,463
  • 2
  • 27
  • 32
0

Actually there is no way to find out the angle between point and origin due to the fact that the origin is (0,0). We can calculate the angle between 2 points beacuse they are treated like vectors and as such they have a direction, but the origin has no direction. For that reason, if you want to find the angle using the example of a clock you can calculate the angle between the point and (1,0) for example being that point at 0 degrees.

I'm sorry I'm not versed in C# but you can have a look at this java code which is similar:

double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) {
  return Math.acos((((p1_x * p2_x) + (p1_y * p2_y)) / (Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2)))));
}

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) {
  return Math.acos((((p1_x * p2_x) + (p1_y * p2_y)) / (Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180 / Math.PI;
}

If you try to calculate using (0,0) you will get NaN beacuse it tries to divide by zero.

Elo
  • 47
  • 9