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)
但是,总共有很多案例,执行情况会变得混乱.有没有什么好方法可以解决这个问题?任何参考?非常感谢!
将其视为向量方程更为实用。点.是标量积,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)
您可以将其作为线性系统来求解:
| 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。所有线性代数库都实现了一些函数来解决这样的系统,所以不用担心。
| 归档时间: |
|
| 查看次数: |
1554 次 |
| 最近记录: |