【问题标题】:Distance from point to line 3d formula从点到线的距离 3d 公式
【发布时间】:2019-03-18 09:36:17
【问题描述】:

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

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

【问题讨论】:

标签: javascript three.js 3d geometry


【解决方案1】:

线(AV)上与点P最近的点X是该点,线(XP)与线(@)垂直987654334@, B)。

如果一条线由两个点AB 定义,那么给出线方向的Unit vector D 可以计算如下(注意单位向量的长度为1) :

D = normalize(B-A);

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

现在必须找到最接近直线上的点POD)的点X

首先计算一个从OP的向量V

V = P - O;

dO到交点(最近点)X的距离可以通过Dot product来计算。
一般来说,2个向量的点积等于2个向量夹角的余弦乘以两个向量的大小(长度)。

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

由于D是单位向量,所以VD的点积等于直线(OD)与向量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); 

ABP线上的点计算为:

D = normalize(B-A);
X = A + D * dot(P-A, D);

3维笛卡尔坐标的dot积可以表示为:

dot(A, B) = Ax*Bx + Ay*By + Az*Bz

一个normalized向量(单位向量)可以这样计算:

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

在纯 Javascript 中,可以这样计算:

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]];

Three.js - Vector3 很容易做到这一点,其中定义了 addsubdotnormalize 等向量算术运算:

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

var D = B.clone().sub( A ).normalize();
var d = P.clone().sub( A ).dot( D );
var X = A.clone().add( D.clone().multiplyScalar( d ) ); 

【讨论】:

  • 谢谢,您帮助我更清楚了。
【解决方案2】:
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 ()

【讨论】:

    【解决方案3】:

    您想在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多