我有两条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
...
然而,总共有很多案例,实施会变得混乱。有没有什么好方法可以解决这个问题?任何参考?非常感谢!
答案 0 :(得分:4)
将此视为矢量方程更为实际。点.
是标量积,A,n,B,m
是描述线的向量。点A
位于方向n
的第一行。方向已标准化:n.n=1
和m.m=1
。交点C
是这样的:
C=A+nt=B+ms
其中t
和s
是要计算的标量参数。
因此(.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)
记住计算永远不会是精确的可能是至关重要的,你的常数和计算中的小偏差会使你的线不完全相交。
因此,让我们解决一个更普遍的问题 - 找到行中相应点之间的距离最小的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)
(这里第一个*
是标量积,其他*
是矢量和数字之间的常规乘法。
导数在最小点应该等于零:
[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])
从这里开始,我们找到t
和s
。
然后,让我们找到与这些t
和s
对应的两个点。如果所有计算都是理想的,那么这些点就会重合。但是,此时你几乎可以保证得到一些小的偏差,所以把这些点作为你的结果(两条线的交点)。
取这些点的平均值可能会更好,以使结果对称。