我有一条线段AB
(2d),从点A
到点B
。对于coastline
(闭合多边形,3 * 10 ^ 3顶点)的表示,我有一个NumPy
点数组(2d),它们在同一点处开始和结束。我想知道点A
和B
之间的连接是否与海岸线相交。
我的第一种方法是遍历封闭多边形的每个线段,并检查其是否与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
答案 0 :(得分:2)
这是一个碰撞检测问题。
因此,在您的情况下,最好的方法是将海岸线放置在一个空间数据结构中,例如bsp树,quad树,aabb树等。
然后在您的线段和树结构之间进行交点。
例如参见CGAL AABB_tree: https://doc.cgal.org/latest/AABB_tree/index.html
该库用于3D,但相同的想法适用于2D。您可以非常快地将几乎任何几何体嵌入aabbtree和查询线相交处