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;
我给出了一条 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;