Общий и равномерный подход состоит в том, чтобы получить угол обоих векторов
theta_u = math.atan2(ux, uy)
theta_v = math.atan2(vx, vy)
и создать новый вектор со средним углом:
middle_theta = (theta_u+theta_v)/2
(bx, by) = (cos(middle_theta), sin(middle_theta))
Таким образом, вы избегаетеловушка, которую вы наблюдали с противоположными векторами.
PS : обратите внимание, что существует неопределенность в том, что такое вектор "биссектриса": обычно есть два вектора биссектрисы (обычно один для меньшего вектора)угол и один для большего угла).Если вы хотите, чтобы вектор биссектрисы находился внутри меньшего угла, тогда ваша оригинальная формула вполне подойдет;Вы можете отдельно обработать особый случай, который вы наблюдали, например, взяв вектор, ортогональный к любому из двух входных векторов (-uy/|u|, ux/|u|)
, если ваша формула дает нулевой вектор.