Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查一条线段是否与一组线段相交_Python_Algorithm_Performance_Numpy_Cython - Fatal编程技术网

Python 检查一条线段是否与一组线段相交

Python 检查一条线段是否与一组线段相交,python,algorithm,performance,numpy,cython,Python,Algorithm,Performance,Numpy,Cython,我有一条a线段AB(2d),从点a到点B。对于海岸线的表示(闭合多边形,3*10^3个顶点),我有一个从同一点开始和结束的点数组(2d)。我想知道,点A和B之间的连接是否与海岸线相交 我的第一种方法是迭代闭合多边形的每个线段,并检查它是否与AB相交。这是 即使我使用NumPy数组或使用cython翻译函数,速度也不够快,因为我必须为不同的as和Bs执行很多次 我想,这可能是一个概念上的问题,我想知道,如果至少存在一个交叉点(True/False),是否有更聪明的方法只检查 我也试着使用shape

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

我的第一种方法是迭代闭合多边形的每个线段,并检查它是否与
AB
相交。这是

即使我使用
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

这是一个碰撞检测问题

因此,在您的情况下,最好是将您的海岸线放在一个空间数据结构中,如bsp树、四叉树、aabb树等

然后在线段和树结构之间执行相交

例如,请参见CGAL AABB_树:


该库适用于3D,但同样的想法也适用于2D。您可以在aabbtree中嵌入几乎任何几何图形,并快速查询线交点

,那么您的期望是什么?不要这么含糊:现在需要多长时间,多快就可以了?你的问题实际上只是一条线段,还是你会检查更多的线段?答案可能取决于这一点,因为那样的话,对海岸线线段进行索引或诸如此类的操作可能是值得的。根据Robert Kerns Line Profiler的说法,我用numpy数组方式创建的函数每次命中需要1583.7*10^-6秒(5788次调用)。有很多关于多边形与线段相交的帖子,请尝试检查这些帖子。无论使用何种方法,由于多边形上有许多顶点,因此最好使用较少的顶点创建一个不太详细的多边形,这样我们就可以根据这个新多边形测试直线。它需要生成,这样,如果它们相交,您将需要与实际详细的一个进行检查,但如果它们不相交,您可以知道它也不与详细的一个相交