延长一条线段的长度到指定距离

38

我正在尝试找到一种方法,以特定距离扩展线段。例如,如果我有一个起点为10,10,终点为20,13的线段,并且我想将长度延长3个单位,我该如何计算新的终点坐标呢?在这个例子中,我可以通过sqrt(a^2 +b^2)来得到长度为10.44。如果我想知道从起始点10,10开始,长度为13.44的新终点坐标,最快的计算方法是什么? 我也知道斜率,但不确定在这种情况下它是否有所帮助。


1
这不是一个编程问题,而是简单的数学问题,你需要将其扩展到你的代码中。 - Constantinius
8
这仍然是一个算法问题,只不过基于数学(计算机科学在这方面非常重要)。 - corsiKa
3个回答

74

你可以通过找到线段的单位向量并将其缩放到所需长度,然后使用该向量来平移线段的端点来完成。假设您的线段端点为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;

11
其中 lenAB = sqrt((A.x - B.x)**2 + (A.y - B.y)**2):lenAB代表从点A到点B的距离,其计算方式为A点和B点在x、y轴上坐标差的平方和的平方根。 - andrew cooke
2
如果你好奇这段代码是什么意思,(B.x - A.x) / lenAB * length 相当于 cos(slope_alpha) * length...对我很有帮助。 - fersarr
7
长度(length)是要添加到行末的额外长度。 - Mark

11

如果您已经有斜率,您可以计算出新的点:

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

我已经有一段时间没做过这个了,所以可能会有些不准确。


7
其中 alpha = atan2(y-old_y, x-old_x) - andrew cooke
谢谢你的帮助,这个解决方案似乎比较慢,比之前那个解决方案还要慢。我很感激你的帮助,这个也能用。 - goodgulf
这对我来说并没有真正起作用,新点从未与给定的两个线点平行。因此它不再是一条直线了。可能是我的错误,也许需要再次检查。 - Peter Pohlmann

6

我刚刚在寻找这个问题的答案时偶然发现了这篇文章。为了给你提供一个开箱即用的解决方案,你可以查看任何一种语言中标准 Vector 类的代码,并挑选自己需要的部分进行使用。但我最终选择使用其中的一个,并且代码如下所示:

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

祝你好运!


我认为这是最优雅的答案。 - John Mott
感谢这个答案。学习向量(线性代数)并经常使用数学工具解决几何问题是一个好建议。你确实能够编写优雅的代码。如果你在团队中工作,提升整个团队在这个领域的知识将使共享的代码更好。 - cervezas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接