10

我有两条位于同一平面上的 3D 线。line1由点 ( x1, y1, z1) 及其方向向量 ( a1, b1, c1)line2定义,而由点 ( x2, y2, z2) 及其方向向量 ( a2, b2, c2) 定义。那么两条线的参数方程是

x = x1 + a1*t;         x = x2 + a2*s;
y = y1 + b1*t;         y = y2 + b2*s;
z = z1 + c1*t;         z = z2 + c2*s;

如果两个方向向量都是非零的,我们可以通过将上面方程的右侧相等并从三个中的任何两个求解t和来轻松找出相交节点的位置。s但是,有可能a1 b1 c1 a2 b2 c2并非都是非零的,因此我无法以相同的方式求解这些方程。我目前的想法是逐案处理这个问题,比如

case1: a1 = 0, others are nonzero
case2: a2 = 0, others are nonzero
case3: b1 = 0, others are nonzero
...

但是,总共有这么多的案例,执行会变得混乱。有什么好的方法可以解决这个问题吗?有什么参考吗?非常感谢!

4

3 回答 3

5

将其视为矢量方程更为实际。点.是标量积,A,n,B,m是描述线的向量。点A在方向的第一条线上n。方向被归一化 :n.n=1m.m=1。交点C是这样的:

 C=A+nt=B+ms

其中ts是要计算的标量参数。

因此 (.n) :

A.n+ t=B.n+m.n s
t= (B-A).n+m.n s

和(.m):

 A.m+n.m t=B.m+ s
 A.m+n.m (B-A).n+(m.n)^2 s=B.m+ s
 n.m(B-A).n+(A-B).m=(1-(m.n)^2).s

由于 nn=mm=1 并且 n 和 m 未对齐,因此 (mn)^2<1 :

 s=[n.m(B-A).n+(A-B).m]/[1-(m.n)^2]
 t= (B-A).n+m.n s
于 2014-03-20T21:28:44.097 回答
3

您可以将其解决为线性系统:

| 1 0 0 -a1   0 | | x |   | x1 |
| 0 1 0 -b1   0 | | y |   | y1 |
| 0 0 1 -c1   0 | | z | = | z1 |
| 1 0 0   0 -a2 | | s |   | x2 |
| 0 1 0   0 -b2 | | t |   | y2 |
| 0 0 1   0 -c2 |         | z2 |

x y z是交点,s t是向量的系数。这解决了@francis 编写的相同方程,其优点是它还获得了在您的数据不完美的情况下最小化错误的解决方案。

这个方程通常表示为Ax=b,并且可以通过做 来求解x = A^(-1) * b,其中A^(-1)是 的伪逆A。所有的线性代数库都实现了一些函数来解决这样的系统,所以不用担心。

于 2014-03-20T22:53:57.280 回答
2

重要的是要记住,计算从来都不是精确的,常数和计算中的小偏差会使你的线不完全相交。

因此,让我们解决一个更一般的问题 - 找到 和 的值,t其中s线中对应点之间的距离最小。这显然是微积分的一项任务,而且很容易(因为线性函数是微积分中最简单的函数)。

所以要点是

[xyz1]+[abc1]*t
and
[xyz2]+[abc2]*s

(这里[xyz1]是一个 3 向量[x1, y1, z1]等等)

它们之间的距离(平方):

([abc1]*t - [abc2]*s + [xyz1]-[xyz2])^2

(这里^2是 3 向量与自身的标量积)

让我们找到这个关于 的导数t

[abc1] * ([abc1]*t - [abc2]*s + [xyz1]-[xyz2])    (multiplied by 2, but this doesn't matter)

(这里第一个*是标量积,其他*s是向量和数字之间的正则乘法)

导数应在最小值处为零:

[abc1] * ([abc1]*t - [abc2]*s + [xyz1]-[xyz2]) = 0

让我们使用关于stoo 的导数——我们也希望它为零。

 [abc1]*[abc1]*t - [abc1]*[abc2]*s = -[abc1]*([xyz1]-[xyz2])
-[abc2]*[abc1]*t + [abc2]*[abc2]*s =  [abc2]*([xyz1]-[xyz2])

从这里,让我们找到tand s

然后,让我们找到与这些t和对应的两个点s。如果所有计算都是理想的,那么这些点就会重合。但是,在这一点上,您实际上可以保证得到一些小的偏差,因此将这些点作为您的结果(两条线的交点)。

取这些点的平均值可能会更好,以使结果对称。

于 2014-03-20T23:00:10.233 回答