Algorithm 多边形分解算法

Algorithm 多边形分解算法,algorithm,polygon,intersection,polygons,convex-polygon,Algorithm,Polygon,Intersection,Polygons,Convex Polygon,是否有人知道一种相对快速的算法,可以将一组多边形分解为不同的重叠区域和非重叠区域,即给定一组n个多边形,找到其中所有不同的区域 例如,输入将是表示圆的4个多边形,如下所示 输出将是以不同颜色显示的表示不同区域的所有多边形 我可以使用多边形操作编写自己的实现,但算法可能会很慢,而且很耗时。我想知道对于这类问题是否有任何优化算法 我觉得没那么难。 我在友好网站上回答了类似的问题,一个较小的社区对此进行了检查: 让我们寻找一个更常见的问题-让我们用曲线代替多边形。让我们允许它们离开图片边界,但

是否有人知道一种相对快速的算法,可以将一组多边形分解为不同的重叠区域和非重叠区域,即给定一组n个多边形,找到其中所有不同的区域

例如,输入将是表示圆的4个多边形,如下所示

输出将是以不同颜色显示的表示不同区域的所有多边形


我可以使用多边形操作编写自己的实现,但算法可能会很慢,而且很耗时。我想知道对于这类问题是否有任何优化算法

我觉得没那么难。 我在友好网站上回答了类似的问题,一个较小的社区对此进行了检查:

  • 让我们寻找一个更常见的问题-让我们用曲线代替多边形。让我们允许它们离开图片边界,但我们只计算完全属于图片的简单多边形
  • 通过检查属于不同曲线的所有线段对来查找所有交点。当然,在真正检查交叉口之前要过滤它们
  • 将所有曲线编号为1..n。设置其中线段的顺序
  • 对于每个点,创建一系列交点SOI,因此:如果从边界端点开始,SOI[1]为空。如果不是,SOI[1]=(与之相交的第一条曲线的编号,相交曲线上左移动的符号)。继续,在SOI中写入每个交点-曲线数(如果有),或0(如果是与边界的交点)
  • 显然,您只寻找内部没有曲线的简单边界区域
  • 两个相邻的非空交点之间的曲线段,我们称之为线段
  • 每个曲线具有SOI:
    • 对于曲线1的线段,从线段的第一个点开始,尝试两次绘制线段的多边形。它是2,因为您可以沿着第一条相交曲线走向两条边
    • 对于右转尝试,仅左转;对于左转尝试,仅右转
    • 如果到达的点没有正确方向的线段,则尝试失败。如果返回曲线1,它将成功。你有一个禁区
    • 记住所有成功的尝试
    • 对曲线1的所有线段重复此操作
    • 对所有其他曲线重复此操作,对照已找到的区域检查所有找到的区域。两个相同的相邻段足够考虑面积相等。
如何找到交叉点的方向。

当p段(p1,p2)与q段(q1,q2)交叉时,我们可以计算向量pXq的向量乘法。我们感兴趣的是它的Z坐标的唯一符号,它在我们的平面之外。如果是+,q从左到右穿过p。如果是-,则q从右向左穿过p

向量乘法的Z坐标在此作为矩阵的行列式计算:

0         0          1
p2x-p1x   p2y-p1y    0
q2x-q1x   q2y-q1y    0
(当然,它可以写得更简单,但这是一个很好的记忆技巧)


当然,如果您要更改左撇子的所有权限,则整个算法实际上没有任何变化。

您在中遇到的问题称为地图覆盖问题。可在O(n*log(n)+k*log(k))时间内求解,其中n为线段数,k为线段交点数

首先,需要将多边形表示为与不同多边形的内部相对应的不同面

然后使用查找所有线段交点并重建边列表。见:或

最后,在“边”列表中的每个循环中漫游,并收集该循环的半边的面。每组面将代表一个明显的重叠区域


另请参见:。

您可能需要某种扫掠线算法,但它是非标准的,并且可能非常容易高效地实现(多段对数线性)。每个算法都“相对较快”-可能最慢的算法除外,但无论如何,这包含一个无限循环。严肃地说:可靠地计算多边形的交点已经够难了(从理论上讲,这很容易,但考虑到浮点运算的有限精度,以及点/线(几乎)重合的“边界情况地狱”,我会小心自己实现这一点)。我假设,当你要求一个“相对快速”的算法时,你想排除对所有多边形及其交点进行两两测试的明显方法吗?你有多少个多边形?@Marco13我正在开发一个可以接受2-8个多边形的程序,但是如果可能的话,我宁愿不测试所有可能的组合。对于这么少的多边形,任何尝试编写“非暴力”算法的努力都是不值得的。但是如果你想这样做:在最坏的情况下,每个多边形与其他多边形(以及其他多边形对的每个交点)相交(就像在你的例子中!)。我目前能想到的唯一可能的优化方法是快速排除那些肯定不相交的多边形。对于您的应用案例,这可能是一种可行的方法吗?感谢您提出了一个我已经有了答案的问题:-)+1。“检查所有段对”不是很有效。多边形相交的计算可以在多段对数线性时间内完成,因此实际上计算所有成对相交可能非常困难better@NiklasB. 当然,通过使用不同的过滤器,可以大大缩短查找交点的时间。但这一部分不那么重要。我甚至不知道,也许提问者已经有了交集点。@NiklasB。我们的任务是给出一个有用的想法,具体工作是关于问题的作者本人。该算法是否处理多个多边形共享一段或一段的一部分的情况?@user3290797是的。但如果他们不能拥有部分细分市场。这个