基于点的线/平面交点

时间:2011-02-08 20:57:33

标签: math line-intersection

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

我在太空中有三个点,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))

但剩下的呢?

2 个答案:

答案 0 :(得分: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的点积是P1和{{1}的点积}。求解N以使x为常数,可以在一个易于求解的变量中给出一个等式。如果你要与这架飞机相交很多线路,这种方法绝对值得。

明确地写出来了:

(L1 + x*(L2 - L1)) dot N

,其中

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

请注意,交叉产品技巧在3个维度上工作,并且仅适用于您的特定平面和线条问题。

答案 1 :(得分: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封面下发生的简单方程式。