如何找出C中两条共面线的交点

时间:2014-03-20 20:36:33

标签: c line-intersection

我有两条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;

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

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

然而,总共有很多案例,实施会变得混乱。有没有什么好方法可以解决这个问题?任何参考?非常感谢!

3 个答案:

答案 0 :(得分:4)

将此视为矢量方程更为实际。点.是标量积,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

由于n.n = m.m = 1且n和m未对齐,(m.n)^ 2< 1:

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

答案 1 :(得分:2)

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

| 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的伪逆。所有线性代数库都实现了一些函数来解决这样的系统,所以不用担心。

答案 2 :(得分:2)

记住计算永远不会是精确的可能是至关重要的,你的常数和计算中的小偏差会使你的线不完全相交。

因此,让我们解决一个更普遍的问题 - 找到行中相应点之间的距离最小的ts的值。这显然是微积分的一项任务,而且很简单(因为线性函数是微积分中最简单的函数)。

所以要点

[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)

(这里第一个*是标量积,其他*是矢量和数字之间的常规乘法。

导数在最小点应该等于零:

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

我们也使用与s相关的衍生物 - 我们也希望它也为零。

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

从这里开始,我们找到ts

然后,让我们找到与这些ts对应的两个点。如果所有计算都是理想的,那么这些点就会重合。但是,此时你几乎可以保证得到一些小的偏差,所以把这些点作为你的结果(两条线的交点)。

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