C ++获取具有最短距离的3D矢量点到给定点

时间:2015-07-29 09:32:33

标签: c++ vector 3d point


我给了一个3D线,用两个3D矢量(开始,端点)表示,所有这些都在 C ++

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

我也有3D点

vec3 x0 = [x,y,z]

我想从我的给定行找到Point p ,它与我的Point x0 之间的距离 d 最短。
以图片为例:

Get Point **P** on given Line Segment

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

取你的等式

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。

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

答案 1 :(得分:0)

您可以将向量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;
相关问题