有谁知道将一组多边形分解成它们不同的重叠和非重叠区域的相对快速的算法,即给定一组n个多边形,找到它们之间的所有不同区域?
例如,输入将是代表圆形的 4 个多边形,如下所示
并且输出将是代表以不同颜色显示的不同区域的所有多边形。
我可以使用多边形操作编写自己的实现,但该算法可能会很慢且耗时。我想知道是否有针对此类问题的优化算法。
有谁知道将一组多边形分解成它们不同的重叠和非重叠区域的相对快速的算法,即给定一组n个多边形,找到它们之间的所有不同区域?
例如,输入将是代表圆形的 4 个多边形,如下所示
并且输出将是代表以不同颜色显示的不同区域的所有多边形。
我可以使用多边形操作编写自己的实现,但该算法可能会很慢且耗时。我想知道是否有针对此类问题的优化算法。
您的问题称为地图叠加问题。它可以在 O(n*log(n)+k*log(k)) 时间内求解,其中 n 是段数,k 是段相交数。
首先,您需要将多边形表示为双向连接的边列表,不同的面对应于不同多边形的内部。
然后使用Bentley-Ottmann 算法查找所有线段相交并重建边缘列表。请参阅:计算两个细分的叠加或细分表示和地图叠加。
最后,遍历边缘列表中的每个循环并收集该循环半边的面。每组面将代表一个不同的重叠区域。
我不认为这有那么难。我已经在友好网站上回答了类似的问题,并由一个较小的社区进行了检查: https ://cs.stackexchange.com/questions/20039/detect-closed-shapes-formed-by-points/20247#20247
如何找到交叉点的方向。
当段 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
(当然,也可以写得更简单,但这是一个很好的记忆技巧)
当然,如果您要更改左侧的所有权利,那么整个算法实际上不会发生任何变化。