2014-03-05 75 views
1

這應該是一個簡單的方法。我試圖找到直線上一個點的座標。我在MATLAB中實現。我知道,端點的座標和距離其中一點的距離。查找線上點的座標

我使用下面的公式計算座標(請注意,我不能使用中點公式,因爲距離可能會有所不同)。

enter image description here

我得到錯誤的結果時,斜率爲負。您能否建議,使用這個公式需要考慮哪些條件?我也不知道任何其他公式。

回答

2

您的解決方案沒有問題,但是當您採用反正切來計算角度θ時需要注意象限模糊。

在大多數編程語言中有一個很好的解決方案:atan2。因此:

%// Your points (fill in any values) 
A = [-10 0]; 
B = [-1 -1]; 

%// Use atan2! 
th = atan2(B(2)-A(2) , B(1)-A(1)); 

%// Distance from A to the point of interest 
AP = sqrt((B(2)-A(2))^2 + (B(1)-A(1))^2)/2; 

%// The point of interest 
C = [ 
    A(1) + AP*cos(th) 
    A(2) + AP*sin(th)]; 

%// Verify correctness with plots 
figure(1), clf, hold on 
line([A(1); B(1)], [A(2); B(2)]) 
plot(... 
    A(1), A(2), 'r.',... 
    B(1), B(2), 'b.',... 
    C(1), C(2), 'k.', 'markersize', 20) 

一般情況下,無論何時何地,你需要採取反正切,用atan2而不是atan。正常的atan僅適用於您不知道部門y/x的各個組件的情況。

請注意,您的解決方案不能擴展到3D,而其他人在這裏提出的矢量解決方案。所以一般來說,我確實會建議你開始使用矢量。在許多情況下,它不僅簡單得多,而且功能更多。

3

這是解決方案的錯誤方法,因爲解決方案不是唯一的。與A點距離相同的AP有兩點:一個是左轉,另一個是右轉。

無限的方法來解決這個問題,我更喜歡矢量符號。

矢量AB是2×1的matlab矩陣:

ab = B-A 

ABN是歸一化矢量

abN = ab/norm(ab) 

在ABN方向從步進d的距離(在你的情況下,AP)爲:

A + abN*d 

希望它有幫助。

5

這對於這樣一個簡單的任務過於複雜的解決方案。使用直接矢量計算:

function P = point_on_line(A, B, AP) 
    D = B - A; 
    P = A + D/norm(D) * AP; 
end 

這樣調用:

P = point_on_line([x1 y1], [x2 y2], len); 
x = P(1); 
y = P(2); 

詢問是否需要任何澄清。