【问题标题】:Check, if one Line Segment intersects with a set of line segments检查一个线段是否与一组线段相交
【发布时间】:2019-01-24 14:33:08
【问题描述】:

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

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

即使我使用NumPy 数组或使用cython 翻译函数,它也不够快,因为我必须为不同的As 和Bs 做很多次.

我想,这可能是一个概念问题,我想知道,是否有更智能的方法来检查是否至少存在一个交叉点 (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

【问题讨论】:

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

标签: python algorithm performance numpy cython


【解决方案1】:

这是一个碰撞检测问题。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多