在matlab中找到两条线的交点

时间:2016-06-02 15:54:22

标签: matlab

我有两条线由两个3D点定义(这些点是固定值)。 我想知道这是“拉伸”这些线的最简单的方法,直到在3D空间找到它们的交叉点。

这是在使用Matlab找到相机焦点的背景下。

1 个答案:

答案 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) = 1norm(uB) = 1

然后沿着A线的点可以表示为:

pA + cA * uA

沿B线的点可以表示为:

pB + cB * uB

然后问题变成找到系数cAcB,使得线条重合,或者:

pA + cA * uA = pB + cB * uB

要解决这个问题,我们可以进行一些简化转换。首先,将pApB条款放在一边,将uAuB条款放在另一边:

cA * uA - cB*uB = pB - pA = vp

其中vp = pB-pA。然后,使用uAuB

获取每一方的点积
cA - cB*dot(uA,uB) = dot(uA,vp)
cA*dot(uA,uB) - cB = dot(uB,vp)

其中dot(x,y)是向量xy的点积,我们已经简化了点积dot(uA,uA) = norm(uA)^2 = 1dot(uB,uB) = norm(uB)^2 = 1。< / p>

这给出了两个带有两个未知数的标量方程,相当于矩阵方程:

[ 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. 存在矩阵方程的解,表示线。该解决方案为交叉点提供cAcB的值。

  2. 向量uAuB是相同的。因此,这些线是平行的,要么重合(pA == pB),要么永远不会相交。

  3. 向量uAuB不同,但解决方案并不存在。线是歪斜的,永远不会相交。