我在空间中有两个点,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))
但剩下的呢?
答案 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
的集合,使得P
和N
的点积是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封面下发生的简单方程式。