5

空間に 2 つの点 L1 と L2 があり、線上の 2 つの点を定義します。

空間に 3 点、P1、P2、P3 が平​​面上に 3 点あります。

これらの入力が与えられた場合、直線が平面と交差する点はどこでしょうか?

Fx。平面方程式 A*x+B*y+C*z+D=0 は次のとおりです。

A = p1.Y * (p2.Z - p3.Z) + p2.Y * (p3.Z - p1.Z) + p3.Y * (p1.Z - p2.Z)
B = p1.Z * (p2.X - p3.X) + p2.Z * (p3.X - p1.X) + p3.Z * (p1.X - p2.X)
C = p1.X * (p2.Y - p3.Y) + p2.X * (p3.Y - p1.Y) + p3.X * (p1.Y - p2.Y)
D = -(p1.X * (p2.Y * p3.Z - p3.Y * p2.Z) + p2.X * (p3.Y * p1.Z - p1.Y * p3.Z) + p3.X * (p1.Y * p2.Z - p2.Y * p1.Z))

しかし、残りはどうですか?

4

2 に答える 2

8

これを解決する最も簡単な (そして非常に一般化可能な) 方法は、

L1 + x*(L2 - L1) = (P1 + y*(P2 - P1)) + (P1 + z*(P3 - P1))

これにより、3 つの変数で 3 つの方程式が得られます。x、y、z について解いてから、元の方程式のいずれかに代入して答えを求めます。これは、4 次元で 2 つの平面の交点である点を見つけるなどの複雑なことを行うために一般化できます。

別のアプローチとして、との外積Nは平面に直角なベクトルです。これは、 との内積がとの内積になるような点の集合として平面を定義できることを意味します。この定数を解くと、簡単に解くことができる 1 つの変数の 1 つの方程式が得られます。この平面で多くの線と交差する場合、このアプローチは間違いなく価値があります。(P2-P1)(P3-P1)PPNP1Nx(L1 + x*(L2 - L1)) dot N

これを明示的に書き出すと、次のようになります。

N = cross(P2-P1, P3 - P1)
Answer = L1 + (dot(N, P1 - L1) / dot(N, L2 - L1)) * (L2 - L1)

どこ

cross([x, y, z], [u, v, w]) = x*u + y*w + z*u - x*w - y*u - z*v
dot([x, y, z], [u, v, w]) = x*u + y*v + z*w

そのクロス積のトリックは 3 次元でのみ機能し、平面と線の特定の問題に対してのみ機能することに注意してください。

于 2011-02-08T21:02:41.403 に答える
1

これが私がcomeコードでそれを行うことになった方法です。幸いなことに、1つのコードライブラリ(XNA)には、必要なものの半分があり、残りは簡単でした。

var lv = L2-L1;
var ray = new Microsoft.Xna.Framework.Ray(L1,lv);
var plane = new Microsoft.Xna.Framework.Plane(P1, P2, P3);

var t = ray.Intersects(plane); //Distance along line from L1
///Result:
var x = L1.X + t * lv.X;
var y = L1.Y + t * lv.Y;
var z = L1.Z + t * lv.Z;

もちろん、私はXNAのカバーの下で行われる単純な方程式だけを持っていることを好みます。

于 2011-02-09T00:55:43.093 に答える