2011-10-12 110 views
18

我試圖找到一種方法,一個特定的距離延長線段。例如,如果我有一個從10,10開始延伸到20,13的線段,並且我希望將長度延長3,那麼我如何計算新的端點。我在這個例子10.44,所以如果我想知道從10,10與13.44長度會是什麼計算以最快的方式將新的端點獲得通過的sqrt(一^ 2 + B^2)的長度是多少?我也知道斜坡,但不知道在這種情況下是否能幫助我。延長線段特定距離

+1

這不是一個編程問題,但簡單的數學,這你就必須擴大你的代碼。 – Constantinius

+3

@Constantinius它仍然是一個算法問題,只是一個基於數學(計算機科學是非常沉重的)。 – corsiKa

+0

@glowcoder:我不同意。如果不瞭解下面的數學問題,他就沒有任何問題可以解決他的任務。另一方面,如果他熟悉數學,將它翻譯成程序代碼是一項微不足道的任務。 – Constantinius

回答

35

可以通過找到你的線段的單位矢量做到這一點,將其縮放到所需的長度,然後翻譯用該載體您的線段的端點。假設你的線段的端點是AB,你想終點B後,延長(與lenAB是線段的長度)。

#include <math.h> // Needed for pow and sqrt. 
struct Point 
{ 
    double x; 
    double y; 
} 

... 

struct Point A, B, C; 
double lenAB; 

... 

lenAB = sqrt(pow(A.x - B.x, 2.0) + pow(A.y - B.y, 2.0)); 
C.x = B.x + (B.x - A.x)/lenAB * length; 
C.y = B.y + (B.y - A.y)/lenAB * length; 
+10

其中lenAB = sqrt((A.x-B.x)** 2 +(A.y - B.y)** 2) –

+0

此解決方案似乎工作得最快。感謝您的幫助 – goodgulf

+2

以防萬一您想知道這是從哪裏來的,(Bx-Ax)/ lenAB *長度與cos(slope_alpha)*長度相同*長度對我有幫助 – fersarr

7

如果你已經有了,你可以計算出新點的斜率:我有一段時間沒有這樣做

x = old_x + length * cos(alpha); 
y = old_y + length * sin(alpha); 

所以把它當作一粒鹽。

+4

其中alpha = atan2(y-old_y,x-old_x) –

+0

感謝您的幫助,此解決方案似乎比較低的解決方案稍慢。我感謝幫助,這也有效。 – goodgulf

3

我只是在這個偶然發現自己尋找此之後,並給你一個徹頭徹尾的現成的解決方案,你可以看看標準Vector類中的代碼(任何語言)和櫻桃選擇你需要的部分,但我最終使用一個,代碼如下所示:

vector.set(x,y); 
vector.normalize(); 
vector.multiply(10000);// scale it by the amount that you want 

祝你好運!

+0

我認爲這是最優雅的答案 –