【问题标题】:A plane subdivision into non-overlapping regions by a set of polygons由一组多边形将平面细分为非重叠区域
【发布时间】:2014-05-22 20:04:04
【问题描述】:

请看示例图片:

平面中有一组多边形(凸面、非凸面、但不是自相交的)。 多边形由顶点定义 - 点(xy 坐标,笛卡尔坐标系)。

多边形示例集:

  • 第一个多边形是 A、B、C。
  • 第二个多边形是 D、E、F、G、H、I、J。
  • 第三个多边形是 K、L、M、N。
  • 第四个多边形是 O、P、Q。

多边形将平面划分为多个区域。多边形的某些部分可能重叠(例如第一个和第二个多边形、第二个多边形和第三个多边形)。这个重叠的部分也是独立的区域。一些多边形可能在其他多边形内(例如第二个多边形内的第四个多边形)。

细分后的示例区域:蓝色、粉色、绿色、橙色、棕色和紫色。

为了简单起见,我认为平面是一个具有恒定 xy 坐标的矩形。

目标

通过查询点检测区域(蓝色、粉色、绿色等)。

我正在寻找具有这些假设的平面细分的算法和数据结构。

【问题讨论】:

  • 您的具体问题是什么?难道你不能首先通过检查哪些多边形重叠来构建所有区域,然后对所有区域执行命中测试吗?
  • 不清楚是要计算区域,还是简单计算查询点在哪个区域。这是两个非常不同的问题。第一个需要相交算法和包含测试,而后者只需要“多边形中的点”算法。

标签: algorithm computational-geometry


【解决方案1】:

首先通过迭代地寻找成对的交点并将这对相交的多边形替换为它们的交点并将原始多边形减去交点来将您的多边形集转换为一组不重叠的多边形。如果您首先将每个多边形拆分为一组凸多边形(凸多边形可以简单地“继承”原始凹多边形的“颜色”),这可能会更容易和更快。

然后,您可以将多边形放入四叉树或类似的数据结构中,这样您就可以快速选择候选多边形用于给定查询点的成员资格测试。

您需要定义在多个多边形之间共享的边上发生的情况。

【讨论】:

    【解决方案2】:

    我可以推荐梯形分解http://en.wikipedia.org/wiki/Point_location#Trapezoidal_decomposition 用于平面细分中的高效点查询。

    在您的情况下,细分是间接定义的,因此有一个额外的步骤。您可以尝试三种方法:

    1) 使用您将逐步调用的通用多边形相交算法,

    2) 形成多边形的梯形分解,并对这些梯形图进行融合,

    3) 修改现有的梯形分解算法,使其接受由重叠多边形形成的细分作为输入。

    您将需要使用一些 2D 计算几何库...和勇气。

    替代方案:

    如果您的精度要求不是太高,请使用位图并填充每个多边形,当满足已绘制的像素时更改颜色。

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 2017-07-07
      • 2018-05-08
      • 2019-03-14
      • 2016-02-05
      • 2021-09-30
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多