Rob*_*ani 10
对于初学者来说,你几乎需要一些Vector3类的实现,无论你是自己编写,在互联网上找到独立的实现,还是使用包含XNA或Sharp3D.Math之类的库.
通常,3d空间中的线不是由两个点表示,而是由参数方程表示,并由向量而不是标量操作.您的参数方程将具有以下形式:
x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1)
Run Code Online (Sandbox Code Playgroud)
向量u由系数定义t.<x2-x1,y2-y1,z2-z1>.
矢量PQ由您选择的点Q减去线上的点P来定义.可以选择线上的任何点,因此最简单的方法就是使用直线t = 0,这简化为x1,y1和z1.<x3-x1,y3-y1,z3-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;
Run Code Online (Sandbox Code Playgroud)
编辑:我刚刚意识到你想要的是实际的交点,而不是距离.找到实际点的公式有点不同.您需要使用内积空间来使u的分量垂直于PQ.要做到这一点,你需要找到的成分ü在方向PQ:
((PQ · u)/ || u || ^ 2)*u
这让我们得到了w1组件,但我们想要w2,它是Q和行之间的组件:
PQ = w1 + w2
w2 = PQ - w1
从那里,我们取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;
Run Code Online (Sandbox Code Playgroud)
当point.X是x4,point.Y是y4和point.Z是z4.
| 归档时间: |
|
| 查看次数: |
9736 次 |
| 最近记录: |