C++ 获取到给定点的最短距离的 3D 向量上的点

C++ Get Point on 3D Vector with Shortest Distance to given Point


我给出了一条 3D 线,它用两个 3D 向量(起点、端点)表示,全部在 C++

vec3 x1 = [x,y,z]
vec3 x2 = [x,y,z]

我还有一个 3D 点

vec3 x0 = [x,y,z]

我想找到点 p 到我的点 x0[=29 的距离最短 d =] 从我给定的行。
这里有一张图片作为例子:

感谢您的帮助!

取你的直线方程

p = x1 + t (x2 - x1)

最近的点 p 使得向量 x0 - p 垂直于直线。 (你可以用毕达哥拉斯/初等微积分证明这一点)。

因此你需要

(p - x0) 。 (x2 - x1) = 0

在哪里。是点积。

(x1 - x0 + t (x2 - x1)) 。 (x2 - x1) = 0

t = - [ (x1 - x0) 。 (x2 - x1) ] / |x2 - x1|^2

其中 |x2 - x1|是量级。

将此代入第一个等式中以找到您想要的 p。

(PS 抱歉我无法格式化方程)

您可以将向量 x1->x0 投影到向量 x1->x2 上,然后您的点 p 将是 x1 + 投影向量。像这样:

if (x1 == x2)
    return x1;

vector x1x0 = x0 - x1;
vector x1x2 = x2 - x1;

float t = x1x0.dot(x1x2) / x1x2.SquaredLength();

if (t <= 0.0)
    return x1;
else if(t >= 1.0)
    return x2;
else
    return x1 + t * x1x2;