Math 基于点的线/平面相交

Math 基于点的线/平面相交,math,line-intersection,Math,Line Intersection,我在空间中有两个点,L1和L2,它们定义了直线上的两个点 空间中有三个点,P1,P2和P3,平面上有三个点 给定这些输入,直线在什么点与平面相交 外汇。平面方程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 *

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

空间中有三个点,P1,P2和P3,平面上有三个点

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

外汇。平面方程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))
但是剩下的呢?

解决这个问题最简单(也是最普遍)的方法就是

L1 + x*(L2 - L1) = (P1 + y*(P2 - P1)) + (P1 + z*(P3 - P1))
它给出了3个变量中的3个方程。求解x,y和z,然后将其替换回原始方程中的任何一个,以得到您的答案。这可以推广到做复杂的事情,比如找到4维空间中两个平面的交点

对于另一种方法,
(P2-P1)
(P3-P1)
的叉积
N
是与平面成直角的向量。这意味着平面可以定义为点集
P
,使得
P
N
的点积是
P1
N
的点积。求解
x
,使
(L1+x*(L2-L1))dotn
为该常数,可在一个变量中得到一个易于求解的方程。如果你想让很多线与这个平面相交,这个方法绝对值得

明确地写出来,这给出了:

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


请注意,叉积技巧仅适用于三维,并且仅适用于平面和直线的特定问题

这就是我最终如何在come代码中完成它的原因。幸运的是,一个代码库(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的封面下建立简单的方程式。

网络上已经有了很多关于这个的方程式,但不是你找到x,y,z所需要的真正的“最终”方程式。我需要的是最后一组简单公式来得到结果的x,y,z。这个答案仍然需要一个人去“解”方程,所以这只是答案的一小部分。我要的答案是:x=[基于P1.x,P1.Y,P1.Z,P2.x…等的公式]和类似的Y和Z。@Morten Nielsen:原因是“最终方程式”是可怕的,不可能理解的,并且保证会被错误地输入到你的程序中。特别是因为我不知道你是如何表达你的观点的。但我将编辑我的节点,使叉积公式更明确。这不是关于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;