Как отмечают комментаторы, не гарантируется решение. Тем не менее, вы можете систематически определять, существует ли решение и, если оно существует, решение. Я нарисую метод в основном псевдокодом:
Проще всего выразить каждую строку в терминах точки и нормализованного единичного вектора для направления. Указанные точки A1, A2 на линии А и В1, В2 по линии В, это может быть сделано следующим образом:
pA = A1, uA = (A2-A1)/norm(A2-A1).
pB = B1, uB = (B2-B1)/norm(B2-B1).
Обратите внимание, что norm(uA) = 1
и norm(uB) = 1
.
Затем точки вдоль линии А может быть выражена как:
pA + cA * uA
И точки вдоль линии B может быть выражена как:
pB + cB * uB
Проблема становится одним из нахождения коэффициентов cA
и cB
такого что линии совпадают, или:
pA + cA * uA = pB + cB * uB
Чтобы решить эту проблему, мы можем сделать несколько упрощающих преобразований. Во-первых, группируют pA
и pB
термины с одной стороны, и uA
и uB
термины на другой:
cA * uA - cB*uB = pB - pA = vp
где vp = pB-pA
. Затем, возьмите скалярное произведение каждой стороны и с uA
и uB
:
cA - cB*dot(uA,uB) = dot(uA,vp)
cA*dot(uA,uB) - cB = dot(uB,vp)
где dot(x,y)
является скалярным произведением векторов x
и y
, и мы упростили точечные продукты dot(uA,uA) = norm(uA)^2 = 1
и dot(uB,uB) = norm(uB)^2 = 1
.
Это дает два скалярного уравнение с двумя неизвестными, и эквивалентен матричным уравнением:
[ 1, -dot(uA,uB) ; dot(uA,uB), -1 ] * C = [ dot(uA,vp) ; dot(uB,vp) ]
Вы можете решить эту проблему в Matlab с помощью оператора обратного замещения \
:
C = [ 1, -dot(uA,uB) ; dot(uA,uB), -1 ] \ [ dot(uA,vp) ; dot(uB,vp) ]
Существует три возможности:
Решение для матричное уравнение существует, что указывает на то, что линии. Решение дает значения cA
и cB
для точки пересечения.
Векторы uA
и uB
такие же.Поэтому линии параллельны и либо совпадают (pA == pB
), либо никогда не пересекаются.
Векторы uA
и uB
отличаются друг от друга, но решения не существует. Линии искажены и никогда не пересекаются.
Две линии не могут пересекаться в трехмерном пространстве. Возможно, вы хотели сначала найти их проекцию на какой-то самолет или другой? –
Как сказал @MadPhysicist, они не могут пересекаться. Вы хотите, скорее всего, найти кратчайшую линию между ними и взять среднюю точку. У Пола Бурка есть отличная рецензия на то, как вы это сделаете: http://paulbourke.net/geometry/pointlineplane/, и здесь реализована реализация MATLAB: http://paulbourke.net/geometry/pointlineplane/linelineintersect.m – Suever