# Angle between three points (2D): Simple code snippet.

posted 2014-Feb-11

Have three 2D points and want to find the angle between them? In JavaScript:

// Center point is p1; angle returned in radians
function findAngle(p0,p1,p2) {
var a = Math.pow(p1.x-p0.x,2) + Math.pow(p1.y-p0.y,2),
b = Math.pow(p1.x-p2.x,2) + Math.pow(p1.y-p2.y,2),
c = Math.pow(p2.x-p0.x,2) + Math.pow(p2.y-p0.y,2);
return Math.acos( (a+b-c) / Math.sqrt(4*a*b) );
}


If speed matters, you may be able to make that a little bit faster by not using Math.pow() and manually squaring the differences instead.

In Ruby, assuming points are [x,y] arrays instead of objects with .x and .y properties, and converting to degrees:

# p1 is the center point; result is in degrees
def angle_between_points( p0, p1, p2 )
a = (p1[0]-p0[0])**2 + (p1[1]-p0[1])**2
b = (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2
c = (p2[0]-p0[0])**2 + (p2[1]-p0[1])**2
Math.acos( (a+b-c) / Math.sqrt(4*a*b) ) * 180/Math::PI
end


Credit for the JavaScript function upon which I based my code comes from this Stack Overflow answer, though that version has unnecessary sqrt calls. Read the answers on that page for the derivation of the above formula.