Угол между точками? - PullRequest
       5

Угол между точками?

37 голосов
/ 25 февраля 2011

У меня есть треугольник (A, B, C), и я пытаюсь найти угол между каждой парой трех точек.

Проблема в том, что алгоритмы, которые я могу найти онлайн, предназначены для определения угла между векторами. Используя векторы, я вычислю угол между вектором, который идет от (0, 0) до точки, которую я имею, и это не дает мне углы внутри треугольника.

Хорошо, вот некоторый код на Python после метода на странице Википедии и после вычитания значений:

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]

for e1, e2 in ((A, B), (A, C), (B, C)):
    num = np.dot(e1, e2)
    denom = np.linalg.norm(e1) * np.linalg.norm(e2)
    print np.arccos(num/denom) * 180

Это дает мне 60.2912487814, 60.0951900475 и 120.386438829, так что я делаю не так?

Ответы [ 5 ]

37 голосов
/ 15 февраля 2015

Здесь есть две ошибки.

  • Вы пропустили фактор & pi; при переводе из радианов в градусы (это & ​​times; 180 / & pi;)

  • Вы должны быть осторожны с признаками векторов, поскольку они являются направленными отрезками.

Если я сделаю эти изменения, я получу результат, который имеет смысл:

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)

который печатает

[19.191300537488704, 19.12889310421054, 141.67980635830079]
180.0

Я бы, вероятно, сделал вещи более симметричными и использовал бы векторы A, B, C, которые являются циклическими и суммируют до нуля:

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)

который печатает

[141.67980635830079, 19.12889310421054, 19.191300537488704]
180.0

Знаки минус в точечном произведении появляются потому, что мы пытаемся получить внутренние углы.

Извините, мы отогнали вас в трудную минуту, закрыв вопрос.

4 голосов
/ 25 февраля 2011

Я бы использовал закон косинусов , поскольку вы можете легко рассчитать длину каждой стороны треугольника и затем решить для каждого угла в отдельности.

0 голосов
/ 25 февраля 2011

Создайте три вектора, один от v2 до v1 (v2-v1), один от v3 до v1 (v3-v1) и один от v3 до v2 (v3-v2). Когда у вас есть эти три вектора, вы можете использовать алгоритмы, которые вы уже нашли, а также тот факт, что все углы добавятся к 180 градусам.

0 голосов
/ 25 февраля 2011

Предположим, что вам нужен угол в точке A. Тогда вам нужно найти угол между вектором от A до B и вектором от A до C. Вектор от A до B - это просто B-A. (Вычтите координаты.)

0 голосов
/ 25 февраля 2011

В качестве альтернативы, если вы знаете только длину сторон треугольника, вы можете использовать Закон косинусов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...