20

I want to get angle between 3 points in JavaScript.

If I have points A(x1,y1), B(x2, y2) and C(x3, y3), I want to get angle that is formed with lines AB and BC.

let A = {x:x1, y:y1}, B = {x:x2, y:y2}, C = {x:x3, y:y3}
1
  • The second question whether there is a difference in angle if these points are geographic coordinates is off-topic to this question but can be asked as another question with tag compass-geolocation. I try to edit and get this highly interesting question on topic again as there already are an answer that worked for me (detecting figures).
    – user985399
    Commented Oct 31, 2019 at 13:02

1 Answer 1

39

Try this function :

 /*
 * Calculates the angle ABC (in radians) 
 *
 * A first point, ex: {x: 0, y: 0}
 * C second point
 * B center point
 */
function find_angle(A,B,C) {
    var AB = Math.sqrt(Math.pow(B.x-A.x,2)+ Math.pow(B.y-A.y,2));    
    var BC = Math.sqrt(Math.pow(B.x-C.x,2)+ Math.pow(B.y-C.y,2)); 
    var AC = Math.sqrt(Math.pow(C.x-A.x,2)+ Math.pow(C.y-A.y,2));
    return Math.acos((BC*BC+AB*AB-AC*AC)/(2*BC*AB));
}
6
  • How to use this function? Any examples? Do i have to pass Arrays as parameter?!
    – Black
    Commented Mar 31, 2016 at 13:03
  • 1
    @EdwardBlack if you look at the code, the points are passed in as an object with the form {x: 0, y: 0} . I edited the answer to reflect this. Commented May 11, 2016 at 4:02
  • 12
    to convert to degree (find_angle(A,B,C) * 180) / Math.PI Commented Sep 21, 2016 at 21:29
  • 7
    This only provides measurements for non-reflex angles, i.e. for angles less than 180 degrees. Thus it does not distinguish between angle ABC and angle CBA. Thus the return result provides no sense of angle "direction". Depending on what the user is looking for, this may or may not be acceptable. Commented Mar 20, 2017 at 12:34
  • 1
    What if the angle is more than 180 degrees? Commented Aug 4, 2020 at 5:32

Not the answer you're looking for? Browse other questions tagged or ask your own question.