gpt4 book ai didi

javascript - 点到线的距离 3d 公式

转载 作者:行者123 更新时间:2023-11-29 17:41:29 27 4
gpt4 key购买 nike

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

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

最佳答案

直线(A, V)上最接近点P的点X就是那个点,其中线 (X, P) 与线 (A, B) 垂直。

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

D = normalize(B-A);

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

现在直线 (O, D) 上最靠近点 P 的点 X 必须被发现。

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

V = P - O;

O到交点(最近点)X的距离d可以通过Dot product计算得到.
一般而言,2 个向量的点积等于 2 个向量之间夹 Angular 的余弦乘以两个向量的大小(长度)。

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

dot A B

由于 D 是一个单位向量,VD 的点积等于直线 (O, 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);

intersection line point

直线AB和点P上的点计算为:

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

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

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

归一化向量(单位向量)可以通过以下方式计算:

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

关于javascript - 点到线的距离 3d 公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52791641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com