3D点上的垂直点

use*_*017 11 c# math 3d geometry

之前已经提到过这个问题参考2D.这个问题扩展到3D.如何在3D空间中的点上找到直线相交点?如果我的线是由点定义(x1,y1,z1)(x2,y2,z2)我有一个点(x3,y3,z3)的空间.

如何在(x3,y3,z3)的直线上找到点(x4,y4,z4)的垂直交点?

Rob*_*ani 10

对于初学者来说,你几乎需要一些Vector3类的实现,无论你是自己编写,在互联网上找到独立的实现,还是使用包含XNASharp3D.Math之类的库.

通常,3d空间中的线不是由两个点表示,而是由参数方程表示,并由向量而不是标量操作.您的参数方程将具有以下形式:

x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1)
Run Code Online (Sandbox Code Playgroud)

向量u由系数定义t.<x2-x1,y2-y1,z2-z1>.

矢量PQ由您选择的点Q减去线上的点P来定义.可以选择线上的任何点,因此最简单的方法就是使用直线t = 0,这简化为x1,y1和z1.<x3-x1,y3-y1,z3-z1>

3空间中点与线之间最短距离的定义如下:

D = || PQ x u ||/|| ||

x交叉乘积运算符在哪里,并|| ... ||获得包含向量的大小.根据您选择的库,您的代码可能会有所不同,但它应该非常相似:

Vector3 u = new Vector3(x2 - x1, y2 - y1, z2 - z1);
Vector3 pq = new Vector3(x3 - x1, y3 - y1, z3 - z1);

float distance = Vector3.Cross(pq, u).Length / u.Length;
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚意识到你想要的是实际的交点,而不是距离.找到实际点的公式有点不同.您需要使用内积空间来使u的分量垂直于PQ.要做到这一点,你需要找到的成分ü在方向PQ:

((PQ · u)/ || u || ^ 2)*u

这让我们得到了w1组件,但我们想要w2,它是Q和行之间的组件:

PQ = w1 + w2

w2 = PQ - w1

从那里,我们取w2并将其添加到点Q以获得最接近Q的线上的点.在代码中,这将是:

Vector3 p1 = new Vector3(x1, y1, z1);
Vector3 p2 = new Vector3(x2, y2, z2);
Vector3 q = new Vector3(x3, y3, z3);

Vector3 u = p2 - p1;
Vector3 pq = q - p1;
Vector3 w2 = pq - Vector3.Multiply(u, Vector3.Dot(pq, u) / u.LengthSquared);

Vector3 point = q - w2;
Run Code Online (Sandbox Code Playgroud)

point.Xx4,point.Yy4point.Zz4.