【问题标题】:Best data structure to store contiguous polygons?存储连续多边形的最佳数据结构?
【发布时间】:2015-01-05 01:21:34
【问题描述】:

对不起,我在措辞这个问题时遇到了很多问题。

我不知道应该使用什么数据结构(或数据结构的组合)来存储相互接壤的多边形排列(就像任何现实世界的地图一样)。

我应该澄清一下:我的意思是让一个点以固定速度在这些多边形的地图(景观)中移动。整个景观都被多边形覆盖——没有空间是未分类的;地图中的每个点都属于某个多边形。这意味着所有多边形在所有边上都与另一个多边形或地图边缘接壤。地图是有界的,但理想情况下,地图有多大或表示多少个多边形都无关紧要。每个多边形都有一个名称(这很重要,因为每个点现在至少属于两个命名的多边形)。在地图中移动的点应该始终知道它所在的多边形的名称,并且当它从一个多边形越过边界进入另一个多边形时,也应该通知该点。 (如果需要任何其他说明,请发表评论。)

有没有公认的方法来做到这一点?

--编辑--

多边形是固定的。所有点和边都需要预先硬编码。点和边永远不会发生不可预测或随机变化(如果它们发生变化,那将是对一个不常见的固定事件的响应)。

【问题讨论】:

  • 多边形是提前固定好的吗?地图有多大?多边形可以改变吗?另外,多边形一定是凸的吗?
  • 如果是第一人称风景,你可能想看看类似this approach
  • 可以认为是多边形的二维图。它也不需要以图形方式表示。该点只需要知道它的 x 和 y 位置变量告诉它它相对于存储的多边形在哪里。虽然图形表示可以帮助我作为人类理解模拟,但就这一点而言,它不应该是必要的。

标签: data-structures computational-geometry


【解决方案1】:

描述这一点的技术术语是planar straight-line graph,其合适的表示是doubly connected edge list (DCEL)。

您的数据结构的一个要求似乎是执行(快速)点位置查询的可能性。 (这个点属于哪个多边形?)有经典的解决方案,其中可以推荐trapezoidal decomposition

我不知道“边界”查询的合适解决方案,即找到具有(可能)线性轨迹的交叉点。您可能可以从点定位问题中进行调整,但这可能会很棘手。

无论如何,如果您的多边形具有合理数量的顶点,那么通过依次尝试所有边来找到与给定直线的所有交点并不是什么大问题。使用 DCEL 表示,当你离开一个多边形时,你知道你进入了哪个。

如果我是你,我会从 DCEL 结构、point-in-polygon 算法和线-多边形相交算法(本质上是一样的)开始。

【讨论】:

    【解决方案2】:

    构建a 2D segment tree,其中每个二维区间对应于多边形的边界框,值类型对应于多边形本身(其边的列表)。

    代理从 p1 移动到 p2 后,对分段树运行窗口查询:搜索与 p1 和 p2 定义的矩形相交/包含的所有 2D 区间(边界框)。

    对于这些边界框中的每个多边形,检查它是否包含 p2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多