Угол между 3 вершинами

Например, GetAngle ((0,0), (100,0), (100,100)) = 90. Как я мог найти угол между 3 2D Точками.

6
задан Jonathan Leffler 17 June 2010 в 13:42
поделиться

4 ответа

Учитывая точки A, B и C, вы хотите угол между AB и AC? Сначала вычислите векторы AB и AC - это просто координаты B минус координаты A и аналогично для AC. Возьмите скалярное произведение двух векторов. Это просто произведение координат x плюс произведение координат y векторов. Разделите это число на длину AB и еще раз на длину AC. Этот результат представляет собой косинус угла между двумя векторами, поэтому возьмите arccos (), и он у вас есть.

9
ответ дан 8 December 2019 в 13:44
поделиться

Используйте скалярное произведение:

(a, b, c) точка (d, e, f) = ad + be + bf .

A dot B = length(A)*length(B)* cos(theta)

theta = arccos ((A точка B) / (длина (A) * длина (B)) - угол между векторами A и B.

1
ответ дан 8 December 2019 в 13:44
поделиться

Это легко, если у вас есть базовые знания линейной алгебры.

Вектор v (в смысле линейной алгебры, а не std :: vector;)) - это кортеж v = (x, y, z).

Норма - это длина вектора | v | = sqrt (x x + y y + z * z)

Внутреннее произведение двух векторов v1 = (x1, y1, z1) и v2 = (x2, y2, z2) равно v1 · v2 = x1 * x2 + y1 * y2 + z1 * z2

Угол между векторами v1 и v2 равен a = acos (v1 · v2 / (| v1 | * | v2 |))

0
ответ дан 8 December 2019 в 13:44
поделиться

Проблема с использованием здесь только скалярного произведения заключается в том, что оно нестабильно около 0 или 180 градусов - наклон acos () приближается к бесконечности около +/- 1,0, что приведет к потере точности.

Чтобы исправить это, вы можете вычислить псевдопересечение и использовать atan2 () следующим образом:

// given A, B, C are 2D points:
BA= B - A; CA= C - A  // vector subtraction, to get vector between points
dot=    BA.x * CA.x + BA.y * CA.y
pcross= BA.x * CA.y - BA.y * CA.x
angle= atan2(pcross, dot)  // this should be the angle BAC, in radians

Это должно быть численно устойчивым, если только один из участков угла не имеет нулевой длины.

Обратите внимание, что это также даст вам угол со знаком , в зависимости от того, идет ли ВАС по часовой стрелке или против часовой стрелки; метод acos () всегда дает положительное значение. Конечно, если вам нужен только положительный угол, вы можете взять abs (угол) ; метод atan2 () по-прежнему будет более надежным и, возможно, более быстрым.

7
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: