之前已经提到这个问题参考2D。这个问题扩展到3D。如何在3D空间中的点上找到直线相交点?如果我的行由点(x1,y1,z1)
& (x2,y2,z2)
我在太空中有一个点(x3,y3,z3)
。
如何在(x3,y3,z3)的线上找到点(x4,y4,z4)的垂直交点?
答案 0 :(得分:10)
对于初学者来说,你几乎需要一些Vector3
类的实现,无论你是自己编写,在互联网上找到一个独立的实现,还是使用包含XNA之类的库或Sharp3D.Math
通常,3d空间中的线不是由两个点表示,而是由参数方程表示,并由向量而不是标量操作。您的参数方程将采用以下形式:
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>
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;
编辑:我刚刚意识到你想要的是实际的交叉点,而不是距离。找到实际点的公式有点不同。您需要使用内部产品空间来使 u 的组件垂直于 PQ 。为此,您需要在 PQ 方向找到 u 的组件:
(( PQ ·你)/ || 你 || ^ 2)* 你
这让我们得到 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;
point.X
为x4
,point.Y
为y4
,point.Z
为z4
。
答案 1 :(得分:2)
在实践中,您要求计算点和线之间的距离,因此从Length
点到与矢量正交的线的矢量(x3,y3,z3)
。如果我们像向量一样想象线条,那意味着两个向量的dot-product等于0
。 (这只是为了给你一个提示)。
答案 2 :(得分:2)
A - (x1,y1,z1), B - (x2,y2,z3) , C - (x3,y3,z3)
我们需要找到AB线中与点C垂直的点D
现在我们有方向向量
VectorAC = normalize(A - C),
VectorCA = normalize(C - A),
VectorAB = normalize(A - B),
点积给出两个矢量之间的角度
AngleA = Angle Between VectorAC and vectorAB
AngleD = Angle Between VectorDC and vector DA, Always 90 deg, As VectorDC and DA are perpendicular to each other.
AngleC = 180 - (AngleA + AngleD), Angle between VectorCD and VectorCA.
所以现在我们有三角三角
使用AAS三角形方法并找到A和D之间的距离。
http://www.mathsisfun.com/algebra/trig-solving-aas-triangles.html
D = (A + (VectorAB * Distance between A and D)).
答案 3 :(得分:0)
我做了标记为最佳答案的答案的计算:
令alpha = [(x3-x1)(x2-x1)+(y3-y1)(y2-y1)+(z3-z1)(z2-z1)] / [( x2-x1)(x2-x1)+(y2-y1)(y2-y1)+(z2-z1)(z2-z1)]
交点=(x1 + alpha *(x2-x1),y1 + alpha *(y2-y1),z1 + alpha *(z2-z1))。