2015-07-21 193 views
1

我在Matlab中寫了一個函數,將點P投影到經過點V1和V2的線上。在Matlab中將點投影到線上,精度不高?

我們稱之爲投影點P'。 P'= alfa * V1 +(1-alfa)* V2

函數返回alfa以及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。

爲什麼會發生?我如何改進它?

+0

我也得到'DIST = 5.4783'用'V =(V2-V1)/標準(V2-V1); Q = dot(P-V1,v)* v + V1; dist = norm(P-Q)'。你的價值似乎是正確的 –

+1

它不能解決你的精度問題,但可能能夠改善你的算法,看看這個[答案](http://stackoverflow.com/questions/31273991/finding-the-point-的交叉路口上-A-3D線垂直到一個目標點/ 31274489#comment50543389_31274489)。這與你正在做的事非常相似。 – Hoki

回答

1

你的價值觀似乎是正確的。下面是一個獨立的計算:

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 
+0

謝謝!看來,我比較我的結果的功能本身就是錯誤的。 – Maria