3D点上的垂直点

时间:2012-02-20 21:09:17

标签: c# math 3d geometry

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

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

4 个答案:

答案 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.Xx4point.Yy4point.Zz4

答案 1 :(得分:2)

在实践中,您要求计算点和线之间的距离,因此从Length点到与矢量正交的线的矢量(x3,y3,z3)。如果我们像向量一样想象线条,那意味着两个向量的dot-product等于0。 (这只是为了给你一个提示)。

答案 2 :(得分:2)

我们也可以使用AAS三角法。

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),

让我们将ADC视为三角形

点积给出两个矢量之间的角度

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))。