Как рассчитать угол между двумя векторами направления, которые образуют закрытую / открытую форму? - PullRequest
4 голосов
/ 28 ноября 2010

Я пытаюсь понять правильный триг.уравнение / функция для определения следующего: Изменение угла (в градусах) между двумя ВЕКТОРАМИ НАПРАВЛЕНИЯ (уже определено), которые представляют два линейных сегмента.Это используется в контексте РАСПОЗНАВАНИЯ ФОРМЫ (рука нарисована пользователем на экране).

В общем,

a) если пользователь рисует (грубую) форму, такую ​​как круг, или овал, или прямоугольник и т. Д. - линии, составляющие эту форму, разбиваются насказать .. 20 баллов (ху пары).

b) У меня есть DirectionVector для каждого из этих сегментов линии.

c) Таким образом, НАЧАЛО сегмента линии (x0, y0), будут точки конца предыдущей строки (таккак для формирования замкнутой фигуры, например, прямоугольника).

ТАК, мой вопрос, учитывая контекст (т.е. определить тип многоугольника), как найти изменение угламежду двумя векторами направления (доступно как два значения с плавающей запятой для x и y) ???

Я видел очень много разных триггеров.уравнения и я ищу ясности в этом.

Большое спасибо заранее, ребята!

Ответы [ 4 ]

6 голосов
/ 28 ноября 2010

Если (x1, y1) является первым вектором направления, а (x2, y2) является вторым, он содержит:

cos (alpha) = (x1 * x2 + y1 * y2) / (sqrt (x1 * x1 + y1 * y1) * sqrt (x2 * x2 + y2 * y2))

sqrt означает квадратный корень.

Look up http://en.wikipedia.org/wiki/Dot_product

Особенно раздел "Геометрическое представление".

3 голосов
/ 28 ноября 2010

Вы можете попробовать atan2:

float angle = atan2(previousY-currentY, previousX-currentY);

, но также, как упоминалось в предыдущих ответах, угол

между двумя векторами = acos (first.dotProduct (second))

2 голосов
/ 01 июля 2014

Полагаю, у вас есть вектор в виде трех точек (x_1, y_1), (x_2, y_2) и (x_3, y_3).

Затем вы можете переместить точки так, чтобы (x_1, y_1) == (0, 0) на

(x_1, y_1) = (x_2, y_2) - (x_1, y_1) (x_2, y_2) = (x_3, y_3) - (x_1, y_1)

Теперь у вас есть такая ситуация:

enter image description here

Представьте себе этот треугольник как два прямоугольных треугольника.Первый имеет угол альфа и часть бета, второй прямоугольный треугольник имеет другую часть бета.

Тогда вы можете применить:

enter image description here

Вы можете рассчитать альфа следующим образом:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

0 голосов
/ 28 ноября 2010

Если я вас правильно понимаю, вы можете просто оценить точечное произведение между двумя векторами и взять соответствующие arccos , чтобы получить угол между этими векторами.

...