三维空间几何 点到直线的距离 - elapsetor

时间:2024-03-09 18:32:37

三维空间几何 点到直线的距离

本文转自【https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html

Point-Line Distance--3-Dimensional

PointLineDistance3D

Let a line in three dimensions be specified by two points x_1=(x_1,y_1,z_1) and x_2=(x_2,y_2,z_2) lying on it, so a vector along the line is given by

 v=[x_1+(x_2-x_1)t; y_1+(y_2-y_1)t; z_1+(z_2-z_1)t].
(1)

The squared distance between a point on the line with parameter t and a point x_0=(x_0,y_0,z_0) is therefore

 d^2=[(x_1-x_0)+(x_2-x_1)t]^2+[(y_1-y_0)+(y_2-y_1)t]^2+[(z_1-z_0)+(z_2-z_1)t]^2.
(2)

To minimize the distance, set d(d^2)/dt=0 and solve for t to obtain

 t=-((x_1-x_0)·(x_2-x_1))/(|x_2-x_1|^2),
(3)

where · denotes the dot product. The minimum distance can then be found by plugging t back into (2) to obtain

d^2=(x_1-x_0)^2+(y_1-y_0)^2+(z_1-z_0)^2+2t[(x_2-x_1)(x_1-x_0)+(y_2-y_1)(y_1-y_0)+(z_2-z_1)(z_1-z_0)]+t^2[(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2]
(4)
=|x_1-x_0|^2-2([(x_1-x_0)·(x_2-x_1)]^2)/(|x_2-x_1|^2)+([(x_1-x_0)·(x_2-x_1)]^2)/(|x_2-x_1|^2)
(5)
=(|x_1-x_0|^2|x_2-x_1|^2-[(x_1-x_0)·(x_2-x_1)]^2)/(|x_2-x_1|^2).
(6)

Using the vector quadruple product

 (AxB)^2=A^2B^2-(A·B)^2
(7)

where x denotes the cross product then gives

 d^2=(|(x_2-x_1)x(x_1-x_0)|^2)/(|x_2-x_1|^2),
(8)

and taking the square root results in the beautiful formula

d = (|(x_2-x_1)x(x_1-x_0)|)/(|x_2-x_1|)
(9)
= (|(x_0-x_1)x(x_0-x_2)|)/(|x_2-x_1|)
(10)
.    
(11)

Here, the numerator is simply twice the area of the triangle formed by points x_0x_1, and x_2, and the denominator is the length of one of the bases of the triangle, which follows since, from the usual triangle area formula, Delta=bd/2

 

Matlab代码实现

norm是计算范数,默认是计算模。

p1= [1,2,3];
p2=[2,3,8];
p0=[4,5,6];
dis = norm(cross((p0-p1),(p0-p2)))/norm(p2-p1);