Угол со знаком между двумя векторами без опорной плоскости

(В трех измерениях) Я ищу способ вычислить угол со знаком между двумя векторами, не имея никакой информации, кроме этих векторов. Как ответил в на этот вопрос , достаточно просто вычислить угол со знаком, учитывая нормаль плоскости, к которой перпендикулярны векторы. Но я не могу найти способ сделать это без этого значения. Очевидно, что перекрестное произведение двух векторов дает такую ​​нормаль, но я столкнулся со следующим противоречием, используя ответ выше:

signed_angle(x_dir, y_dir) == 90
signed_angle(y_dir, x_dir) == 90

где я ожидал бы, что второй результат будет отрицательным. Это связано с тем, что перекрестное произведение cross(x_dir, y_dir)находится в направлении, противоположном cross(y_dir, x_dir), учитывая следующий псевдокод с нормализованным вводом:

signed_angle(Va, Vb)
    magnitude = acos(dot(Va, Vb))
    axis = cross(Va, Vb)
    dir = dot(Vb, cross(axis, Va))
    if dir < 0 then
        magnitude = -magnitude
    endif
    return magnitude

Я не верю, что dir когда-либо будет отрицательным.

Я видел ту же проблему с предложенным решением atan2.

Я ищу способ сделать:

signed_angle(a, b) == -signed_angle(b, a)

12
задан Community 23 May 2017 в 12:19
поделиться