3D点上的垂直点

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

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

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

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

 x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1) 

向量ut的系数定义。

矢量PQ由您选择的点Q减去线上的点P来定义。 可以选择线上的任何点,因此最简单的方法是使用线t = 0 ,这简化为x1,y1和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; 

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

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

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

PQ = w1 + w2

w2 = PQw1

从那里,我们取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; 

其中point.Xx4point.Yy4point.Zz4

在实践中,您要求计算点和线之间的距离,因此从(x3,y3,z3)指向的矢量Length指向与矢量正交的直线。 如果我们像向量一样想象线条,那意味着两个向量的点积等于0 。 (这只是为了给你一个提示)。

我们也可以使用AAS三角法。

A - (x1,y1,z1), B - (x2,y2,z3) , C - (x3,y3,z3)

我们需要在AB线上找到垂直于C点的D点

现在我们有Directional Vectors

 VectorAC = normalize(A - C), VectorCA = normalize(C - A), VectorAB = normalize(A - B), 

让我们将ADC视为三角形

点积给出2个向量之间的角度

 AngleA = Angle Between VectorAC and vectorAB AngleD = Angle Between VectorDC and vector DA, Always 90 deg, As VectorDC and DA are perpendicular to each other. AngleC = 180 - (AngleA + AngleD), Angle between VectorCD and VectorCA. 

所以现在我们有三角形的三角形

使用AAS三角形方法找到A和D之间的距离。

http://www.mathsisfun.com/algebra/trig-solving-aas-triangles.html

  D = (A + (VectorAB * Distance between A and D)). 

我做了标记为最佳答案的答案的计算:
令alpha = [(x3-x1) (x2-x1)+(y3-y1) (y2-y1)+(z3-z1) (z2-z1)] / [(x2-x1) (x2-x1)+ (y2-y1) (y2-y1)+(z2-z1) (z2-z1)]
交点=(x1 + alpha *(x2-x1),y1 + alpha *(y2-y1),z1 + alpha *(z2-z1))。