检查一个线段是否与一组线段相交

时间:2018-08-17 14:10:51

标签: python algorithm performance numpy cython

我有一条线段AB(2d),从点A到点B。对于coastline(闭合多边形,3 * 10 ^ 3顶点)的表示,我有一个NumPy点数组(2d),它们在同一点处开始和结束。我想知道点AB之间的连接是否与海岸线相交。

我的第一种方法是遍历封闭多边形的每个线段,并检查其是否与AB相交。这是the underlying method

即使我使用NumPy数组或使用cython转换函数,也不够快,因为我必须为不同的A做很多次s和B s。

我认为,这可能是一个概念问题,我想知道是否存在一种更智能的检查方式,是否至少存在一个交叉点(True / False)?

我也尝试使用shapely。但这有点慢。

from shapely.geometry import LineString
import numpy as np

coastline = LineString(np.dstack(x_values,y_values))

def intersection(A,B,Coastline):

      AB = LineString([(A[0], A[1]), (B[0], B[1])])
      if AB.intersection(coastline).is_empty:
         return False
      return True

1 个答案:

答案 0 :(得分:2)

这是一个碰撞检测问题。

因此,在您的情况下,最好的方法是将海岸线放置在一个空间数据结构中,例如bsp树,quad树,aabb树等。

然后在您的线段和树结构之间进行交点。

例如参见CGAL AABB_tree: https://doc.cgal.org/latest/AABB_tree/index.html

该库用于3D,但相同的想法适用于2D。您可以非常快地将几乎任何几何体嵌入aabbtree和查询线相交处