我需要在许多凸多边形(最多数万)上应用布尔OR运算(a.k.a并集),每个多边形的顶点少于100个。我尝试了Boost.Geometry(boost :: geometry :: union_()函数),它需要大约200ms才能合并1500个多边形。
我已经实现了一个简单的优化:
这种优化比逐个结合多边形快大约10倍。
我需要一个算法或一个C / C ++库来在大约10ms内完成这些操作。
有什么建议吗?
====编辑====
我已经用Clipper(http://www.angusj.com/delphi/clipper.php)取代了Boost.Geometry,它满足了我的要求。 Clipper可以在一个操作中结合多个多边形(Boost.Geometry一次只能联合两个),这可能是它比Boost.Geometry快得多的原因。
答案 0 :(得分:-1)
您可以尝试扫描线算法,该算法将一次处理所有多边形。
自上而下定向所有边缘,并按顶部顶点的纵坐标自上而下对其进行排序。
维护一个活动列表,即通过当前顶点穿过水平线的所有边的列表。对于线的位置,您可以确定具有活动边的所有交点。保持活动边缘水平排列,交叉点的横坐标。
当您从一个顶点移动到下一个顶点时,一些边缘进入列表而其他边缘则离开它。此外,在排序过程中,一些边可以交换,这表明它们相交。
交叉点成对出现,跟踪多边形内的线段。沿水平方向合并所有段是一个简单的一维问题。
将所有这些成分放在一起,通过将合并的输出从扫描线的一个位置链接到下一个位置,您将形成一个与最终并集相对应的图形。它不一定是连接的。
应该可以将整个过程实现为单次传递,并避免在不需要的地方分割边缘。
并且关注如何组织活动列表处理,算法应该在时间O(N Log(N)+ NK)中运行,其中K是侧交叉的数量。