【发布时间】:2014-03-14 23:20:11
【问题描述】:
有没有人知道一种相对快速的算法,可以将一组多边形分解为它们不同的重叠和非重叠区域,即给定一组 n 个多边形,找到它们之间的所有不同区域?
例如,输入将是代表圆形的 4 个多边形,如下所示
输出将是所有多边形,代表以不同颜色显示的不同区域。
我可以使用多边形操作编写自己的实现,但该算法可能会很慢而且很耗时。我想知道是否有针对此类问题的优化算法。
【问题讨论】:
-
您可能会想要某种扫描线算法,但它是非标准的,并且可能非常不容易高效地实现(多对数线性)
-
每个算法都“相对较快”——除了可能是最慢的算法,但无论如何这都包含一个无限循环。说真的:稳健地计算多边形的交点已经够难了(理论上,这很容易,但考虑到浮点运算的精度有限,以及点/线的“边界情况地狱”(几乎)重合,我会警惕自己实施这个)。我假设当您要求“相对快速”的算法时,您想排除对所有多边形及其交点进行成对测试的明显算法?你有多少个多边形?
-
@Marco13 我正在开发一个接受 2-8 个多边形的程序,但是是的,如果可能的话,我宁愿不测试所有可能的组合。
-
对于这么少的多边形,任何编写“非暴力”算法的尝试都是不值得的。但是如果你想这样做:在最坏的情况下,每个多边形与每个其他多边形(以及其他多边形对的每个相交)无论如何(就像在你的例子中一样! )。我目前能想到的唯一可能的优化是某种en.wikipedia.org/wiki/Bounding_volume_hierarchy,以快速排除肯定不相交的多边形。对于您的应用案例,这可能是一种可行的方法吗?
-
感谢您提出我已经得到答案的问题 :-) +1。
标签: algorithm polygon intersection polygons convex-polygon