存在一种线性扫描算法来计算n个矩形并集的面积。详情请参考链接。
如文章所述,存在一个O(N^2)时间的布尔数组实现。使用正确的数据结构(平衡二叉搜索树),可以将其降低到O(NlogN)时间。
上述算法也可扩展用于确定顶点。
细节:
将事件处理方式修改如下:
当您将边添加/删除到活动集时,请注意边的起点和终点。如果任何点位于已存在的活动集内,则它不构成一个顶点,否则它是一个顶点。
这样您就能找到结果多边形的所有顶点。
对于一个相对简单可靠的方法,您可以按照以下步骤进行操作:
独立地对所有横坐标(垂直边)和纵坐标(水平边)进行排序,并且舍弃任何重复的。
这将建立坐标和整数索引之间的映射。
创建一个大小为NxN的二进制图像,填充黑色。
对于每个矩形,在相应的索引之间用白色填充图像。
然后通过轮廓追踪扫描图像以找到角点,并还原到原始坐标。
这个过程并不高效,因为它需要与N²成比例的时间加上矩形(逻辑)面积的总和,但对于适量的矩形来说是有用的。它可以轻松处理重叠的情况。
对于两个矩形的情况,可能的不同配置并不多,您可以预先计算可能配置的所有顶点序列(2^9个可能图像的一个小子集)。
无需显式创建图像,只需将顶点序列与输入X和Y的可能排列关联即可。
了解二叉空间分割(BSP)。
https://en.wikipedia.org/wiki/Binary_space_partitioning
如果你只有两个矩形,那么一些技巧可以产生一些结果,但是要找到多边形的交集和并集,您需要实现BSP。个人认为这个问题应该像工程程序/语言中解决所有其他几何问题一样,使用网格化方法。 首先,使用例如MatLab meshgrid将您的顶点转换为固定大小的矩形网格。 然后遍历所有网格元素并删除任何具有重复边缘元素的元素。现在将剩余网格的数量相加,并乘以您选择的网格的面积。