我正在寻找一个JavaScript 3D公式来获取从点到线的距离。该公式也可以使用另一种编程语言。 P是点,A和B是直线的点。
P=(4,2,1);
A=(1,0,1);
B=(1,2,0);
答案 0 :(得分:2)
直线(X
,P
上的点A
到直线点V
的最接近点X
是直线(P
,{ {1}})垂直于行(A
,B
)。
如果一条线由两个点A
和B
定义,则给出该线方向的Unit vector D
可以按以下公式计算(请注意向量的长度是1):
D = normalize(B-A);
对于以下公式,需要在线上的点O
,例如O = A
。
现在必须找到线(X
,P
)上最接近点O
的点D
。
首先计算从V
到O
的向量P
:
V = P - O;
从d
到交点(最近点)O
的距离X
可以由Dot product计算。
通常,两个向量的点积等于两个向量之间的夹角余弦乘以两个向量的大小(长度)。
dot( A, B ) == | A | * | B | * cos( angle_A_B )
由于D
是单位向量,因此V
和D
的点积等于线之间的夹角余弦(O
,{{1} })和向量D
乘以V
的数量(长度):
V
交点d = dot(V, D);
可以通过沿线X
将点O
移动距离D
来计算:
d
所以交点的公式是:
X = O + D * d;
通过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]];
,add
,sub
和dot
:< / 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 ()