Рассчитать угол поворота

0

У меня есть прямоугольник на сцене, и я хочу повернуть его с помощью мыши. Прямоугольник имеет свою собственную точку отсчета. Нажатие на сцену представляет собой начало вращения, а перемещение мыши - угол поворота.

Изображение 174551

где:

  • O - происхождение точки поворота
  • A - опорная точка (сохраняется в событии OnMousePress)
  • C - текущая точка (из события OnMouseMove)

поэтому я вычисляю угол в следующих шагах:

Кулак, я получаю длины сторон треугольника:

AO = sqrt( (O.x - A.x)^2 + (O.y - A.y)^2 )

CO = sqrt( (O.x - C.x)^2 + (O.y - C.y)^2 )

AC = sqrt( (C.x - A.x)^2 + (C.y - A.y)^2 )

и затем вычисляю угол (а):

a = arccos ( (AO^2 + CO^2 - AC^2)/(2 * AO * CO) )

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

Итак, мой вопрос - есть ли другой способ рассчитать угол? Я пишу его в c++, поэтому некоторые фрагменты кода будут оценены.

Теги:
geometry
rotation

2 ответа

1
Лучший ответ

Вы можете найти угол между векторами OA и OC через их скалярное произведение и кросс-произведение:

OA = (OA.X, OA.Y) = (A.X-O.X, A.Y-O.Y)
OC = (OC.X, OC.Y) = (C.X-O.X, C.Y-O.Y)
SP = OA * OC = OA.X*OC.X+OA.Y*OC.Y
CP = OA x OC = OA.X*OC.Y-OA.Y*OC.X
Angle = atan2(CP, SP)

Пример: O = (0,0), A = (-1, 0), C = (-2, 1) SP = 2, CP = -1, Угол = -0.463

Этот метод позволяет избежать вычислений sqrt и определяет направление вращения (в отличие от arccos)

0

Вы используете точечный продукт векторов OA и OC, деленный на их величину, чтобы вычислить косинус угла, а затем используйте функцию acos() чтобы найти угол.

float cosAngle = (x1 * x2 + y1 * y2) / sqrt(x1*x1 + y1*y1) * sqrt(x2*x2 + y2*y2);
float angle = acos(cosAngle);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню