如何找到两条线段的交点?

15
假设我们有两个由两个点(在二维空间中)定义的有限线段。我想找到一种方法来获取这两条线的交点。最终,我想将其扩展为适用于连接线段组的情况。
我在这里找到了一个好的解决方案:Python - matplotlib:查找线图的交点。然而,这依赖于scipy,我相信它需要BLAS,但基于其他原因,我希望避免使用它。
matplotlib有一个称为Path的模块,其中包含一个intersects_path()函数(http://matplotlib.org/api/path_api.html#matplotlib.path.Path.intersects_path),该函数返回是否存在交点的true或false,但不返回我所需的特定位置。
请问有没有人知道一个简洁的方法来解决这个问题?
我正在构思的任何解决方案都很冗长,如果已经存在解决方案,我真的很希望不要重新发明轮子。
谢谢!

2
这应该很简单,对吧?1)使用端点求解每条线段的“斜率”和“y截距”。2)在您知道每条线的方程后解决交点。3)检查此交点是否位于两条线上(而不是线段外)。 - Cory Kramer
正如Cyber所说,这应该是相当简单的。请在这里查看并确认你是否理解:https://dev59.com/gm855IYBdhLWcg3wFALy - Michael Aquilina
1
Shapely可以非常快速地完成这项任务,https://pypi.python.org/pypi/Shapely - HYRY
Shapely正是我不想重新发明的轮子。非常棒的包。谢谢! - Sergiy
1个回答

27

为了完整起见,我想发布我使用的最终解决方案。

使用Shapely(https://pypi.python.org/pypi/Shapely),代码可以看起来如此简单:

from shapely.geometry import LineString

line1 = LineString([(0,0), (1,0), (1,1)])
line2 = LineString([(0,1), (1,1)])

print(line1.intersection(line2))

返回:

POINT (1 1)

这个算法的好处在于它可以无缝地处理单点相交和线段相交,并且相同的技术可以应用于更加复杂的对象。


对于那些安装Shapely的人:你只需要安装C API依赖项libgeos-c1。请参见:http://stackoverflow.com/q/17777613/892482 - Bort

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