Using the law of cosines and vector dot product formula to find the angle between three points

For any 3 points A, B, and C on a cartesian plane. If we have to find the angle between these points, there are many ways we can do that. In this article I will talk about the two frequently used methods:

  1. The Law of Cosines formula
  2. Vector Dot product formula

Law of Cosines

For any given triangle ABC with sides AB, BC and AC, the angle formed by the lines AB and BC is given by the formula:

Here is how we can derive that formula:

The same can be extended for other angles as well.

Now, if we were given 3 points on a cartesian plane, we can find the distance between any two points using the Euclidean distance formula:

So, to find the angle between three points A(x1,y1), B(x2,y2) and C(x3,y3), our formula becomes:

In Python we can represent the above formula using the code:

import numpy as np
import math

def angle_between_three_points(pointA, pointB, pointC):
    
    x1x2s = math.pow((pointA[0] - pointB[0]),2)
    x1x3s = math.pow((pointA[0] - pointC[0]),2)
    x2x3s = math.pow((pointB[0] - pointC[0]),2)
    
    y1y2s = math.pow((pointA[1] - pointB[1]),2)
    y1y3s = math.pow((pointA[1] - pointC[1]),2)
    y2y3s = math.pow((pointB[1] - pointC[1]),2)

    cosine_angle = np.arccos((x1x2s + y1y2s + x2x3s + y2y3s - x1x3s - y1y3s)/(2*math.sqrt(x1x2s + y1y2s)*math.sqrt(x2x3s + y2y3s)))

    return np.degrees(cosine_angle)

A = np.array([2,4])
B = np.array([8,7])
C = np.array([9,1])

print("Angle between points:", angle_between_three_points(A,B,C))
# gives 72.89

A = np.array([0,0])
B = np.array([0,4])
C = np.array([4,0])


print("Angle between points:", angle_between_three_points(A,B,C))
# gives 45.0

Vector Dot Product

The three points can also be represented as a vector as shown below.

where,

The scalar product or the dot product of two vectors is represented by the formula:

where || * || is the magnitude of the vector and θ is the angle made by the two vectors.

From the above formula we can represent the angle using the formula:

In Python we can represent the above formula using the code:

def angle_between_three_points(pointA, pointB, pointC):
    BA = pointA - pointB
    BC = pointC - pointB

    try:
        cosine_angle = np.dot(BA, BC) / (np.linalg.norm(BA) * np.linalg.norm(BC))
        angle = np.arccos(cosine_angle)
    except:
        print("exc")
        raise Exception('invalid cosine')

    return np.degrees(angle)

The above is code from my post where I talked about finding the collinearity of three points on a plane using the angle formed by the points.

References: