Ближайшая точка 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 )
Поскольку 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);
Расчет по точкам на линии 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 ) );