答案 0 :(得分:4)
存在Line Sweep Algorithm来计算n个矩形的并集区域。有关算法的详细信息,请参阅链接。
如文章中所述,在O(N ^ 2)时间内存在布尔数组实现。使用正确的数据结构(平衡二进制搜索树),可以将其缩短为O(NlogN)时间。
可以扩展上面的算法以确定顶点。
<强>详细信息:强>
按如下方式修改事件处理:
在活动集中添加/删除边时,请注意边的起点和终点。如果任何一点位于已存在的活动集内,则它不构成顶点,否则就是。
通过这种方式,您可以找到合成多边形的所有顶点。
请注意,上面的方法可以扩展到一般多边形,但更多涉及。
答案 1 :(得分:1)
查看二进制空间分区(BSP)。
https://en.wikipedia.org/wiki/Binary_space_partitioning
如果你只有两个矩形,那么一些黑客可以产生一些结果,但是为了找到多个多边形的交叉点和联合,你需要实现BSP。
Schneider和Eberly的计算机图形几何工具的第13章介绍了BSP。请务必下载本书的勘误表!
Eberly是其中一位合着者,拥有一个精彩的网站,其中包含PDF和个别主题的代码示例:
答案 2 :(得分:1)
对于一种相对简单可靠的方法,您可以按照以下方式工作:
独立地对所有横坐标(垂直边)和纵坐标(水平边)进行排序,并丢弃任何副本。
这将建立坐标和整数索引之间的映射。
创建一个大小为NxN的二进制图像,填充黑色。
对于每个矩形,在相应的索引之间填充白色图像。
然后扫描图像以contour tracing找到角落,并恢复原始坐标。
此过程效率不高,因为它需要与N²成比例的时间加上矩形的(逻辑)区域的总和,但它对于适量的矩形可能很有用。它很容易处理巧合。
在两个矩形的情况下,可能没有太多不同的配置,您可以预先计算所有顶点序列以获得可能的配置(2 ^ 9个可能图像的一小部分)。
无需显式创建图像,只需将顶点序列与输入X和Y的可能排列相关联。
答案 3 :(得分:0)
就我个人而言,我认为应该解决这个问题,因为所有其他几何问题都在工程程序/语言,网格化中得到解决。 因此,首先将顶点转换为固定大小的矩形网格,例如: MatLab meshgrid 然后遍历所有网格元素并删除任何具有重复边元素的元素。现在将剩余网格的数量相加,并将其乘以您选择的网格区域。