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

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

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

解决方法

对于初学者,您几乎需要Vector3类的一些实现,无论您是自己编写的,还是在互联网上找到独立的实现,或者使用包含像 XNASharp3D.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 = PQw1

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...