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:

theta formula using the points

Here is how we can derive that formula:

triangle

law of cosine derivation

The same can be extended for other angles as well.

angles of the triangle formula

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:

Euclidean formula

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

angle between three points formula

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.

vectors on graph

where,

vectors

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

vector dot product

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:

Cosines formula for theta

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: