之前已经提到了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> ;. 矢量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.