Например, GetAngle ((0,0), (100,0), (100,100)) = 90. Как я мог найти угол между 3 2D Точками.
Учитывая точки A, B и C, вы хотите угол между AB и AC? Сначала вычислите векторы AB и AC - это просто координаты B минус координаты A и аналогично для AC. Возьмите скалярное произведение двух векторов. Это просто произведение координат x плюс произведение координат y векторов. Разделите это число на длину AB и еще раз на длину AC. Этот результат представляет собой косинус угла между двумя векторами, поэтому возьмите arccos (), и он у вас есть.
Используйте скалярное произведение:
(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.
Это легко, если у вас есть базовые знания линейной алгебры.
Вектор 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 или 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 () по-прежнему будет более надежным и, возможно, более быстрым.