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

使用矢量点积有一个简单的封闭形式解决方案(不需要循环或近似值)。
将您的点想象为向量,其中点 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 将结果向量转换回原始坐标系。
直线 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,否则定义。
| 归档时间: |
|
| 查看次数: |
20157 次 |
| 最近记录: |