Чтобы получить перпендикулярное расстояние от точки Q
до линии, определяемой двумя точками P_1
и P_2
, рассчитайте это:
d = DOT(Q, CROSS(P_1, P_2) )/MAG(P_2 - P_1)
, где DOT
- это скалярное произведение, CROSS
- это векторное перекрестное произведение, а MAG
- это величина (sqrt(X*X+Y*Y+..)
)
.
Используя рис. 5. Вы вычисляете d_1
расстояние от sj
до линии (si->ei
) и d_2
расстояние от ej
до той же линии.
Я бы установил систему координат на основе трех точек: двух (P_1
, P_2
) для линии и третьего Q
для начала или конца другой линии сегмент. Три оси системы координат можно определить так:
e = UNIT(P_2 - P_1) // axis along the line from P_1 to P_2
k = UNIT( CROSS(e, Q) ) // axis normal to plane defined by P_1, P_2, Q
n = UNIT( CROSS(k, e) ) // axis normal to line towards Q
где UNIT()
- функция для возврата единичного вектора (с величиной = 1).
Затем вы можете установить все ваши проекционные длины с помощью простых точек. Таким образом, учитывая линию si-ei
и точку sj
на рисунке 5, длины составляют:
(l || 1) = DOT(e, sj-si);
(l |_ 1) = DOT(n, sj-si);
ps = si + e * (l || 1) //projected point
А с концом второго сегмента ej
необходимо вычислить новые координатные оси (e
, k
, n
)
(l || 2) = DOT(e, ei-ej);
(l |_ 1) = DOT(n, ej-ei);
pe = ei - e * (l || 1) //projected point
В конечном итоге угловое расстояние составляет
(d th) = ATAN( ((l |_ 2)-(L |_ 1))/MAG(pe-ps) )
PS. Возможно, вы захотите опубликовать это на Math.SO , где вы можете получить лучшие ответы.