2011-10-12 108 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

我认为这是最优雅的答案 –