我有两条线由两个3D点定义(这些点是固定值)。 我想知道这是“拉伸”这些线的最简单的方法,直到在3D空间找到它们的交叉点。
这是在使用Matlab找到相机焦点的背景下。
答案 0 :(得分:1)
正如评论者提到的那样,并不能保证成为一种解决方案。但是,您可以系统地确定解决方案是否存在,以及解决方案是否存在。我将以大部分伪代码描绘该方法:
根据点和方向的归一化单位向量表示每条线是最容易的。给定A行和A1行的A1,A2,B行的B2,这可以按如下方式进行:
pA = A1, uA = (A2-A1)/norm(A2-A1).
pB = B1, uB = (B2-B1)/norm(B2-B1).
请注意norm(uA) = 1
和norm(uB) = 1
。
然后沿着A线的点可以表示为:
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
。< / p>
这给出了两个带有两个未知数的标量方程,相当于矩阵方程:
[ 1, -dot(uA,uB) ; dot(uA,uB), -1 ] * C = [ dot(uA,vp) ; dot(uB,vp) ]
您可以使用反向替换运算符\
:
C = [ 1, -dot(uA,uB) ; dot(uA,uB), -1 ] \ [ dot(uA,vp) ; dot(uB,vp) ]
有三种可能性:
存在矩阵方程的解,表示线。该解决方案为交叉点提供cA
和cB
的值。
向量uA
和uB
是相同的。因此,这些线是平行的,要么重合(pA == pB
),要么永远不会相交。
向量uA
和uB
不同,但解决方案并不存在。线是歪斜的,永远不会相交。