Пусть линии определены как A + t * dA, B + s * dB
, где A, B
- базовые точки, а dA, dB
- нормализованные векторы направления.
Если гарантируется, что линии имеют пересечение, это можно найти, используя подход с точечным произведением (адаптированный из алгоритма минимального расстояния перекоса):
u = A - B
b = dot(dA, dB)
if abs(b) == 1: # better check with some tolerance
lines are parallel
d = dot(dA, u)
e = dot(dB, u)
t_intersect = (b * e - d) / (1 - b * b)
P = A + t_intersect * dA
Теперь о биссектрисе:
bis1 = P + v * normalized(dA + dB)
bis2 = P + v * normalized(dA - dB)
Быстрая проверка для 2D-кейса
k = Sqrt(1/5)
A = (3,1) dA = (-k,2k)
B = (1,1) dB = (k,2k)
u = (2,0)
b = -k^2+4k2 = 3k^2=3/5
d = -2k e = 2k
t = (b * e - d) / (1 - b * b) =
(6/5*k+2*k) / (16/25) = 16/5*k * 25/16 = 5*k
Px = 3 - 5*k^2 = 2
Py = 1 + 10k^2 = 3
normalized(dA+dB=(0,4k)) = (0,1)
normalized(dA-dB=(-2k,0)) = (-1,0)