У меня есть прямоугольник на сцене, и я хочу повернуть его с помощью мыши. Прямоугольник имеет свою собственную точку отсчета. Нажатие на сцену представляет собой начало вращения, а перемещение мыши - угол поворота.
где:
поэтому я вычисляю угол в следующих шагах:
Кулак, я получаю длины сторон треугольника:
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++, поэтому некоторые фрагменты кода будут оценены.
Вы можете найти угол между векторами 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)
Вы используете точечный продукт векторов OA и OC, деленный на их величину, чтобы вычислить косинус угла, а затем используйте функцию acos()
чтобы найти угол.
float cosAngle = (x1 * x2 + y1 * y2) / sqrt(x1*x1 + y1*y1) * sqrt(x2*x2 + y2*y2);
float angle = acos(cosAngle);