Angle between points?

There are two errors here.

  • You missed a factor of π when translating from radians to degrees (it’s × 180 / π)

  • You have to be careful about the signs of vectors, since they are directed line segments.

If I make these modifications I get a result that makes sense:

import numpy as np
points = np.array([[343.8998, 168.1526], [351.2377, 173.7503], [353.531, 182.72]])

A = points[2] - points[0]
B = points[1] - points[0]
C = points[2] - points[1]

angles = []
for e1, e2 in ((A, B), (A, C), (B, -C)):
    num = np.dot(e1, e2)
    denom = np.linalg.norm(e1) * np.linalg.norm(e2)
    angles.append(np.arccos(num/denom) * 180 / np.pi)
print angles
print sum(angles)

which prints out

[19.191300537488704, 19.12889310421054, 141.67980635830079]
180.0

I’d probably make things more symmetrical and use A, B, C vectors that are cyclic and sum to zero:

import numpy as np
points = np.array([[343.8998, 168.1526], [351.2377, 173.7503], [353.531, 182.72]])

A = points[1] - points[0]
B = points[2] - points[1]
C = points[0] - points[2]

angles = []
for e1, e2 in ((A, -B), (B, -C), (C, -A)):
    num = np.dot(e1, e2)
    denom = np.linalg.norm(e1) * np.linalg.norm(e2)
    angles.append(np.arccos(num/denom) * 180 / np.pi)
print angles
print sum(angles)

which prints out

[141.67980635830079, 19.12889310421054, 19.191300537488704]
180.0

The minus signs in the dot product come because we’re trying to get the inside angles.

I’m sorry we drove you away in your time of need, by closing the question.

Leave a Comment