Биссектриса двух векторов в 2D (может быть коллинеарной) - PullRequest
3 голосов
/ 03 июля 2011

Как найти бисекор b = (bx, by) из двух векторов в целом (мы рассматриваем два ненулевых вектора u = (ux, uy), v = (vx, vy), которые могут быть коллинеарными).

Для неколлинеарного вектора мы можем написать:

bx = ux/|u| + vx / |v|
by = uy/|u| + vy / |v|

Но для коллинеарных векторов

bx = by = 0.

Пример:

u = (0 , 1)
v = (0, -1)
b = (0, 0)

Ответы [ 2 ]

6 голосов
/ 03 июля 2011

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

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|), если ваша формула дает нулевой вектор.

5 голосов
/ 03 июля 2011

Для нахождения единичных векторов деления пополам на u и v.

if u/|u|+v/|v| !=0

first calculate the unit vector of u and v

then use the parallelogram rule to get the bisection (just add them)

since they both have unit of 1, their sum is the bisector vector 

then calculate the unit vector of the calculated vector.

else (if u/|u|+v/|v| ==0):
 (if you use the method above, it's like a indintermination: 0*infinity=?)

 if you want the bisector of (u0v) if u/|u| = (cos(t),sin(t)) 
 take b=(cost(t+Pi/2),sin(t+Pi/2)) = (-sin(t),cos(t) )as the bisector
 therefore if u/|u|=(a1,a2) chose b=(-a2,a1)

Пример:

u=(0,1)
v=(0,-1)
the bisector of (u0v):
b=(-1,0)
...