Угол между 3 вершинами - PullRequest
6 голосов
/ 17 июня 2010

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

Ответы [ 4 ]

9 голосов
/ 17 июня 2010

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

7 голосов
/ 17 июня 2010

Проблема с использованием только точечного произведения здесь заключается в том, что он нестабилен около 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(angle); метод atan2 () все еще будет более устойчивым и, вероятно, быстрее.

1 голос
/ 17 июня 2010

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

(a,b,c) dot (d,e,f) = ad + be + bf.

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

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

0 голосов
/ 17 июня 2010

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

Вектор 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 |))

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