微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

原文地址:https://www.jb51.cc/csharp/93217.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐