10

同じ平面上にある 2 つの 3D ラインがあります。line1は点 ( ) とその方向ベクトル ( ) で定義され、 は点 ( x1, y1, z1) とその方向ベクトル ( a1, b1, c1)でline2定義されます。次に、両方の線のパラメトリック方程式は次のとおりです。x2, y2, z2a2, 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;

両方の方向ベクトルが非ゼロの場合、上記の方程式の右辺を等式化し、3 つのうちのいずれか 2 つから と を解くことで、交差ノードの位置を簡単に見つけることができ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=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

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

についても導関数を使用しましょうs。それもゼロにしたいのです。

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

tここからとを求めてみましょうs

tでは、これらとに対応する 2 点を見つけてみましょうs。すべての計算が理想的であれば、これらの点は一致します。ただし、この時点では、わずかな偏差が発生することが実質的に保証されているため、これらの点を結果 (2 つの線の交点) として取得します。

結果を対称にするために、これらのポイントの平均を取る方がよい場合があります。

于 2014-03-20T23:00:10.233 に答える