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

Jin*_*Yan 8 c line-intersection

我有两条位于同一平面上的3D线.line1由point(x1, y1, z1)及其方向向量(a1, b1, c1)line2定义,而由point(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;
Run Code Online (Sandbox Code Playgroud)

如果两个方向向量都是非零,我们可以通过将上面的等式的右侧等于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
...
Run Code Online (Sandbox Code Playgroud)

但是,总共有很多案例,执行情况会变得混乱.有没有什么好方法可以解决这个问题?任何参考?非常感谢!

fra*_*cis 5

将其视为向量方程更为实用。点.是标量积,A,n,B,m是描述线条的向量。点A位于第一条方向线上n。方向已标准化:n.n=1和m.m=1。交点C是这样的:

 C=A+nt=B+ms
Run Code Online (Sandbox Code Playgroud)

其中t和s是要计算的标量参数。

因此 (.n) :

A.n+ t=B.n+m.n s
t= (B-A).n+m.n s
Run Code Online (Sandbox Code Playgroud)

和(.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
Run Code Online (Sandbox Code Playgroud)

由于 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
Run Code Online (Sandbox Code Playgroud)


Chr*_*ger 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 |
Run Code Online (Sandbox Code Playgroud)

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

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