我在Matlab中写了一个函数,将点p投影到经过点V1和V2的直线上。
我们称投影点为p '。P' = (1- α)*V2
函数返回alpha和p到p '之间的距离。
function [alfa, dist] = ProjectPoint(P, V2, V1)
d1 = pdist2(P, V1);
d2 = pdist2(P, V2);
d = pdist2(V1, V2);
t = ((d1*d1 - d2*d2)/d) + d;
t = t/2;
alfa = t/d;
dist = sqrt( d1*d1 - t*t );
对于简单的输入,函数看起来正确并返回正确的结果。
但有时结果会出现不可接受的错误。例如,对于
V1 = [40.1587, 50.7355, 36.00];
V2 = [36.5079, 45.0980, 33.00];
P = [36.5079, 45.0980, 39.00];
我的结果是:alfa = 0.6673, dist = 5.4783。
正确的结果是:alfa = 0.6064, dist = 5.4966。
为什么会发生?我该如何改进它?
你的价值观似乎是正确的。这是一个独立的计算:
V1 = [40.1587, 50.7355, 36.00];
V2 = [36.5079, 45.0980, 33.00];
P = [36.5079, 45.0980, 39.00];
v = (V2-V1)/norm(V2-V1); %// normalized vector from V1 to V2
Q = dot(P-V1,v)*v+V1; %// projection of P onto line from V1 to V2
dist = norm(P-Q);
alfa = (Q(1)-V1(1))/(V2(1)-V1(1));
结果:
dist =
5.4783
alfa =
0.6673