快速算法或库结合许多凸多边形

时间:2015-11-03 13:39:47

标签: polygon computational-geometry

我需要在许多凸多边形(最多数万)上应用布尔OR运算(a.k.a并集),每个多边形的顶点少于100个。我尝试了Boost.Geometry(boost :: geometry :: union_()函数),它需要大约200ms才能合并1500个多边形。

我已经实现了一个简单的优化:

  1. 将多边形分成两组,
  2. 递归地将两个组合并为两个多边形集,
  3. 联合最后两个多边形集。
  4. 这种优化比逐个结合多边形快大约10倍。

    我需要一个算法或一个C / C ++库来在大约10ms内完成这些操作。

    有什么建议吗?

    ====编辑====

    我已经用Clipper(http://www.angusj.com/delphi/clipper.php)取代了Boost.Geometry,它满足了我的要求。 Clipper可以在一个操作中结合多个多边形(Boost.Geometry一次只能联合两个),这可能是它比Boost.Geometry快得多的原因。

1 个答案:

答案 0 :(得分:-1)

您可以尝试扫描线算法,该算法将一次处理所有多边形。

自上而下定向所有边缘,并按顶部顶点的纵坐标自上而下对其进行排序。

维护一个活动列表,即通过当前顶点穿过水平线的所有边的列表。对于线的位置,您可以确定具有活动边的所有交点。保持活动边缘水平排列,交叉点的横坐标。

当您从一个顶点移动到下一个顶点时,一些边缘进入列表而其他边缘则离开它。此外,在排序过程中,一些边可以交换,这表明它们相交。

交叉点成对出现,跟踪多边形内的线段。沿水平方向合并所有段是一个简单的一维问题。

将所有这些成分放在一起,通过将合并的输出从扫描线的一个位置链接到下一个位置,您将形成一个与最终并集相对应的图形。它不一定是连接的。

应该可以将整个过程实现为单次传递,并避免在不需要的地方分割边缘。

并且关注如何组织活动列表处理,算法应该在时间O(N Log(N)+ NK)中运行,其中K是侧交叉的数量。