5

我在空间中有两个点,L1 和 L2,它们定义了一条线上的两个点。

我在空间中有三个点,P1、P2 和 P3,这 3 个点在一个平面上。

那么给定这些输入,这条线在什么点与平面相交?

外汇。平面方程 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 维中两个平面的交点。

对于另一种方法, 和 的叉积N(P2-P1)(P3-P1)平面成直角的向量。这意味着平面可以定义为点的集合,P使得 和 的点积是和PN点积。求解这个常数可以为您提供一个易于求解的变量中的方程。如果您要与这架飞机相交很多线,那么这种方法绝对值得。P1Nx(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

这就是我最终在代码中完成它的方式。幸运的是,一个代码库 (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 回答