点到线的距离3d公式

时间:2018-10-13 09:46:46

标签: javascript three.js 3d geometry

我正在寻找一个JavaScript 3D公式来获取从点到线的距离。该公式也可以使用另一种编程语言。 P是点,A和B是直线的点。

P=(4,2,1);
A=(1,0,1);
B=(1,2,0);

3 个答案:

答案 0 :(得分:2)

直线(XP上的点A到直线点V的最接近点X是直线(P,{ {1}})垂直于行(AB)。

如果一条线由两个点AB定义,则给出该线方向的Unit vector D可以按以下公式计算(请注意向量的长度是1):

D = normalize(B-A);

对于以下公式,需要在线上的点O,例如O = A

现在必须找到线(XP)上最接近点O的点D

首先计算从VO的向量P

V = P - O;

d到交点(最近点)O的距离X可以由Dot product计算。
通常,两个向量的点积等于两个向量之间的夹角余弦乘以两个向量的大小(长度)。

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 

dot A B

由于D是单位向量,因此VD的点积等于线之间的夹角余弦(O,{{1} })和向量D乘以V的数量(长度):

V

交点d = dot(V, D); 可以通过沿线X将点O移动距离D来计算:

d

所以交点的公式是:

X = O + D * d;    

intersection line point

通过O ... any point on the line D ... unit vector which points in the direction of the line P ... the "Point" X = O + D * dot(P-O, D); A行和点B上的点的计算是:

P

3维笛卡尔坐标的D = normalize(B-A); X = A + D * dot(P-A, D); 乘积可以表示为:

dot

dot(A, B) = Ax*Bx + Ay*By + Az*Bz 向量(单位向量)可以通过以下方式计算:

normalized

在纯Javascipt中,可以这样确定:

len(A) = sqrt(Ax*Ax + Ay*Ay + Az*Az)
notrmalize(A) = A / len(A)

使用Three.js - Vector3可以很容易地做到这一点,其中定义了矢量算术运算,例如var P=[4,2,1]; var A=[1,0,1]; var B=[1,2,0]; var AB = [B[0]-A[0], B[1]-A[1], B[2]-A[2]]; var lenAB = Math.sqrt(AB[0]*AB[0] + AB[1]*AB[1] + AB[2]*AB[2]); var D = [AB[0]/lenAB, AB[1]/lenAB, AB[2]/lenAB]; var AP = [P[0]-A[0], P[1]-A[1], P[2]-A[2]]; var d = D[0]*AP[0] + D[1]*AP[1] + D[2]*AP[2]; var X = [A[0] + d * D[0], A[1] + d * D[1], A[2] + d * D[2]]; addsubdot:< / p>

normalize

答案 1 :(得分:2)

您要计算3D中从点到线的距离。 three.js具有Line3类,它将为您进行计算。

var line = new THREE.Line3(); // create once and reuse

var P = new THREE.Vector3(); // ditto
var A = new THREE.Vector3();
var B = new THREE.Vector3();
var C = new THREE.Vector3();

P.set( 4, 2, 1 );
A.set( 1, 0, 1 );
B.set( 1, 2, 0 );

// calculate C, the closest point on the (infinite) line AB
line.set( A, B ).closestPointToPoint( P, false, C ); 

var distance = P.distanceTo( C );

console.log( distance );

three.js r.97

答案 2 :(得分:0)

P=new THREE.Vector3(4,2,1);
A=new THREE.Vector3(1,0,1);
B=new THREE.Vector3(1,2,0);

Normal=B.clone ().sub (A).normalize ()

Distance = Normal.multiplyScalar (P.sub (A).dot (Normal)).add (A).sub (P).length ()