C# · 12月 27, 2021

c# – 三维点上的3D垂直点

之前已经提到了2D的问题.这个问题将其扩展到3D.如何从3D空间中的一个点找到一条线上的垂直相交点?如果我的行由点(x1,y1,z1)& (x2,y2,z2),我在空间中有点(x3,y3,z3).

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

解决方法 对于初学者,您几乎需要Vector3类的一些实现,无论您是自己编写的,还是在互联网上找到独立的实现,或者使用包含像 XNA或 Sharp3D.Math这样的库.

通常,三维空间中的线不是由两点表示,而是由参数方程表示,而由矢量而非标量运算.您的参数方程式为:

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

向量u由t的系数定义. < x2-x1,y2-y1,z2-z1&gt ;. 矢量PQ由您选择的点Q减去线上的点P定义.可以选择线上的任何点,因此使用线条t = 0将变得最简单,这可简化为x1,y1和z1. < x3-x1,y3-y1,z3-z1>

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

D = ||PQ x u|| / ||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方向找到u的组件:

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

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

PQ = w1 + w2

w2 = PQ – w1

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

Vector3 p1 = new Vector3(x1,z1);Vector3 p2 = new Vector3(x2,z2);Vector3 q = new Vector3(x3,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.X是x4,point.Y是y4,point.Z是z4.