Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate angle (clockwise) between two points

Tags:

I have been not using math for a long time and this should be a simple problem to solve.

Suppose I have two points A: (1, 0) and B: (1, -1).

I want to use a program (Python or whatever programming language) to calculate the clockwise angle between A, origin (0, 0) and B. It will be something like this:

angle_clockwise(point1, point2) 

Note that the order of the parameters matters. Since the angle calculation will be clockwise:

  • If I call angle_clockwise(A, B), it returns 45.
  • If I call angle_clockwise(B, A), it returns 315.

In other words, the algorithm is like this:

  1. Draw a line (line 1) between the first point param with (0, 0).
  2. Draw a line (line 2) between the second point param with (0, 0).
  3. Revolve line 1 around (0, 0) clockwise until it overlaps line 2.
  4. The angular distance line 1 traveled will be the returned angle.

Is there any way to code this problem?

like image 591
Eric Avatar asked Jul 30 '15 23:07

Eric


People also ask

How do you find the angle between two GPS points?

Here is the formula to find the second point, when first point, bearing and distance is known: latitude of second point = la2 = asin(sin la1 * cos Ad + cos la1 * sin Ad * cos θ), and. longitude of second point = lo2 = lo1 + atan2(sin θ * sin Ad * cos la1 , cos Ad – sin la1 * sin la2)


2 Answers

Numpy's arctan2(y, x) will compute the counterclockwise angle (a value in radians between -π and π) between the origin and the point (x, y).

You could do this for your points A and B, then subtract the second angle from the first to get the signed clockwise angular difference. This difference will be between -2π and 2π, so in order to get a positive angle between 0 and 2π you could then take the modulo against 2π. Finally you can convert radians to degrees using np.rad2deg.

import numpy as np  def angle_between(p1, p2):     ang1 = np.arctan2(*p1[::-1])     ang2 = np.arctan2(*p2[::-1])     return np.rad2deg((ang1 - ang2) % (2 * np.pi)) 

For example:

A = (1, 0) B = (1, -1)  print(angle_between(A, B)) # 45.  print(angle_between(B, A)) # 315. 

If you don't want to use numpy, you could use math.atan2 in place of np.arctan2, and use math.degrees (or just multiply by 180 / math.pi) in order to convert from radians to degrees. One advantage of the numpy version is that you can also pass two (2, ...) arrays for p1 and p2 in order to compute the angles between multiple pairs of points in a vectorized way.

like image 185
ali_m Avatar answered Sep 19 '22 19:09

ali_m


Use the inner product and the determinant of the two vectors. This is really what you should understand if you want to understand how this works. You'll need to know/read about vector math to understand.

See: https://en.wikipedia.org/wiki/Dot_product and https://en.wikipedia.org/wiki/Determinant

from math import acos from math import sqrt from math import pi  def length(v):     return sqrt(v[0]**2+v[1]**2) def dot_product(v,w):    return v[0]*w[0]+v[1]*w[1] def determinant(v,w):    return v[0]*w[1]-v[1]*w[0] def inner_angle(v,w):    cosx=dot_product(v,w)/(length(v)*length(w))    rad=acos(cosx) # in radians    return rad*180/pi # returns degrees def angle_clockwise(A, B):     inner=inner_angle(A,B)     det = determinant(A,B)     if det<0: #this is a property of the det. If the det < 0 then B is clockwise of A         return inner     else: # if the det > 0 then A is immediately clockwise of B         return 360-inner 

In the determinant computation, you're concatenating the two vectors to form a 2 x 2 matrix, for which you're computing the determinant.

like image 21
Chris St Pierre Avatar answered Sep 18 '22 19:09

Chris St Pierre