Расстояние от точки до линии 3d формула - PullRequest
0 голосов
/ 13 октября 2018

Я ищу трехмерную формулу JavaScript, чтобы получить расстояние от точки до линии.Формула также может быть на другом языке программирования.P - это точка, а A & B - это точки на линии.

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

Ответы [ 3 ]

0 голосов
/ 14 октября 2018
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 ()
0 голосов
/ 14 октября 2018

Вы хотите рассчитать расстояние от точки до линии в 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

0 голосов
/ 13 октября 2018

Ближайшая точка X к точке P на линии (A, V) - это та точка, где линия (X, P) нормальна к линии (A, B).

Если линия определена двумя точками A и B, то Единичный вектор 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 ) 

dot A B

Поскольку D является единичным вектором, скалярное произведение V и D равно косинусу угла между линией (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

Расчет по точкам на линии A, B и точка P:

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

dot Произведение для трехмерных декартовых координат может быть выражено как:

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

A normalized вектор (единичный вектор) может быть вычислен следующим образом:

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

В чистом javascipt это можно вычислить следующим образом:

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, где определены операции для векторной арифметики типа add, sub, dot и normalize:

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