2016-06-02 2 views
0

У меня есть две линии, определяемые двумя точками 3D (эти точки являются фиксированными значениями). Я хочу знать, что это самый простой способ «растянуть» эти линии, пока не найдет их точку пересечения на трехмерном пространстве.Найти точку пересечения двух строк в matlab

Это контекст поиска фокуса камеры с использованием Matlab.

+3

Две линии не могут пересекаться в трехмерном пространстве. Возможно, вы хотели сначала найти их проекцию на какой-то самолет или другой? –

+0

Как сказал @MadPhysicist, они не могут пересекаться. Вы хотите, скорее всего, найти кратчайшую линию между ними и взять среднюю точку. У Пола Бурка есть отличная рецензия на то, как вы это сделаете: http://paulbourke.net/geometry/pointlineplane/, и здесь реализована реализация MATLAB: http://paulbourke.net/geometry/pointlineplane/linelineintersect.m – Suever

ответ

1

Как отмечают комментаторы, не гарантируется решение. Тем не менее, вы можете систематически определять, существует ли решение и, если оно существует, решение. Я нарисую метод в основном псевдокодом:

Проще всего выразить каждую строку в терминах точки и нормализованного единичного вектора для направления. Указанные точки 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) ] 

Существует три возможности:

  1. Решение для матричное уравнение существует, что указывает на то, что линии. Решение дает значения cA и cB для точки пересечения.

  2. Векторы uA и uB такие же.Поэтому линии параллельны и либо совпадают (pA == pB), либо никогда не пересекаются.

  3. Векторы uA и uB отличаются друг от друга, но решения не существует. Линии искажены и никогда не пересекаются.