垂直于给定点的线段

Moh*_*tha 24 math 3d geometry

我想计算给定线上与给定点垂直的点.

我有一个线段AB并且在线段之外有一个点C. 我想计算AB上的点D,使得CD垂直于AB.

找点D

我必须找到D点.

它与非常相似,但我想考虑Z坐标,因为它在3D空间中没有正确显示.

jdb*_*ron 25

证明:D点位于垂直于AB的CD线上,当然D属于AB.记下两个矢量CD.AB = 0的Dot积,并表示D属于AB的事实为D = A + t(BA).

我们最终得到3个方程式:

 Dx=Ax+t(Bx-Ax)
 Dy=Ay+t(By-Ay)
(Dx-Cx)(Bx-Ax)+(Dy-Cy)(By-Ay)=0
Run Code Online (Sandbox Code Playgroud)

在第三个方程中减去前两个方程给出:

(Ax+t(Bx-Ax)-Cx)(Bx-Ax)+(Ay+t(By-Ay)-Cy)(By-Ay)=0
Run Code Online (Sandbox Code Playgroud)

分配解决t给出:

(Ax-Cx)(Bx-Ax)+t(Bx-Ax)(Bx-Ax)+(Ay-Cy)(By-Ay)+t(By-Ay)(By-Ay)=0
Run Code Online (Sandbox Code Playgroud)

这使:

t= -[(Ax-Cx)(Bx-Ax)+(Ay-Cy)(By-Ay)]/[(Bx-Ax)^2+(By-Ay)^2]
Run Code Online (Sandbox Code Playgroud)

摆脱负面迹象:

t=[(Cx-Ax)(Bx-Ax)+(Cy-Ay)(By-Ay)]/[(Bx-Ax)^2+(By-Ay)^2]
Run Code Online (Sandbox Code Playgroud)

一旦你有t,你可以从前两个方程中找出D的坐标.

 Dx=Ax+t(Bx-Ax)
 Dy=Ay+t(By-Ay)
Run Code Online (Sandbox Code Playgroud)

  • 这忽略了原始问题的Z分量. (2认同)
  • 如果要将找到的点 D 限制在 A 和 B 之间的直线上,请限制 t 为 0 >= t <= 1。 (2认同)

cui*_*ing 21

function getSpPoint(A,B,C){
    var x1=A.x, y1=A.y, x2=B.x, y2=B.y, x3=C.x, y3=C.y;
    var px = x2-x1, py = y2-y1, dAB = px*px + py*py;
    var u = ((x3 - x1) * px + (y3 - y1) * py) / dAB;
    var x = x1 + u * px, y = y1 + u * py;
    return {x:x, y:y}; //this is D
}
Run Code Online (Sandbox Code Playgroud)

题

  • 很高兴看到你做了什么的一点解释. (4认同)

Ron*_*lic 6

使用矢量点积有一个简单的封闭形式解决方案(不需要循环或近似值)。

将您的点想象为向量,其中点 A 位于原点 (0,0) 并且所有其他点都从中引用(您可以通过从每个点中减去点 A 轻松地将您的点转换到此参考系)。

在这个参考系中,点 D 只是点 C 在矢量 B 上的矢量投影,表示为:

// Per wikipedia this is more efficient than the standard (A . Bhat) * Bhat
Vector projection = Vector.DotProduct(A, B) / Vector.DotProduct(B, B) * B
Run Code Online (Sandbox Code Playgroud)

可以通过添加点 A 将结果向量转换回原始坐标系。


Eri*_*lle 6

直线 AB 上的点可以通过以下方式参数化:

M(x)=A+x*(BA),对于 x 实数。

您希望 D=M(x) 使得 DC 和 AB 正交:

点(BA,CM(x))=0。

即: dot(BA,CAx*(BA))=0,或 dot(BA,CA)=x*dot(BA,BA),给出:

x=dot(BA,CA)/dot(BA,BA) 除非 A=B,否则定义。