将凸多边形外部的空间划分为水平跨越四边形

时间:2017-05-03 10:06:41

标签: polygon decomposition convex

我正在寻找一种算法,该算法可以将包含一组非重叠凸多边形的区域作为输入,并将多边形外部的空间分解为一组非重叠的凸四边形。四边形需要具有它们(单独)使用尽可能多的水平空间的属性。

这是输入:

enter image description here

这是所需的输出:

enter image description here

我觉得我已经看到这个算法的一些变化,用于计算在非常旧的绘画程序中充满洪水的区域。有没有比O(n^2)时间更好的方式来做到这一点?

编辑:我意识到输出中有一些三角形。我应该说四边形是理想的输出,只有当物理上不可能使用四边形时才会回到三角形。

1 个答案:

答案 0 :(得分:1)

我想出了一个解决方案。为了有效地解决这个问题,需要某种空间数据结构以便查询哪些多边形与给定的矩形区域重叠。我使用了Quadtree。使用多边形数据结构也必须能够区分内部外部边缘。如果两个多边形共有边,则边是内部

步骤如下(假设坐标系的原点位于左上角):

  1. 将所有多边形插入到您正在使用的任何空间数据结构中。
  2. 遍历所有多边形并构建所有Y值的列表 哪个顶点出现。这具有概念上划分的效果 场景成水平条:
  3. scene division

    1. 从上到下迭代Y对值。对于每一个 配对Y值的(y0, y1),声明一个矩形区域a 左上角(0, y0)和右下角 (width, y1)。确定多边形S的集合 通过查询空间数据结构与a重叠。对于 p中的每个多边形S,确定E的边p的边集 与a重叠的。为获得最佳效果,请忽略任何边缘 E normal直接向上或向下指向的e。对于每一个 E中的边e,然后需要确定这对 aa的顶部和底部边缘相交的点。 这是通过简单的line intersection测试实现的, 将L0 = (0, y0) → (0, y1)的顶部和底部边缘视为简单的水平 线段。加入交叉点来创建一组 新的细分市场,以红色显示:
    2. enter image description here

      1. 创建垂直线段L1 = (width, y0) → (width, y1)L0。从左到右工作, 将前一步骤中创建的任何线段聚合成对, 忽略从内部边创建的任何线段。 如果没有相交的外边缘,那么只有两个 边缘将是L1const languages = [ { name: 'English', icon: './assets/images/flags/uk.png', link: '' }, { name: 'Español', icon: './assets/images/flags/Spain.png', link: '' }, { name: 'Français', icon: './assets/images/flags/France.png', link: '' } ]; 。在这个示例条中,只有四个 边缘仍然存在:
      2. enter image description here

        1. 将剩余边对中的顶点连接起来进行创建 多边形:
        2. enter image description here

          对每个水平条重复上述过程 期望的结果。假设有一组凸,非重叠 多边形作为输入,保证创建的多边形 三角形或四边形。如果水平条包含 没有边缘,算法将创建一个矩形。如果不 多边形存在于场景中,算法将创建单个 覆盖整个场景的矩形。