如何计算两个(或更多)矩形的并集多边形

时间:2016-02-11 17:18:35

标签: algorithm graphics polygon computational-geometry rectangles

例如,我们有两个矩形,它们重叠。我想得到他们联合的确切范围。计算这个的好方法是什么?

这是两个重叠的矩形。假设顶点的绳索都是已知的:

Two rectangels

如何计算联合多边形顶点的绳索?如果我有两个以上的矩形怎么办?

The union of them

4 个答案:

答案 0 :(得分:4)

存在Line Sweep Algorithm来计算n个矩形的并集区域。有关算法的详细信息,请参阅链接。

如文章中所述,在O(N ^ 2)时间内存在布尔数组实现。使用正确的数据结构(平衡二进制搜索树),可以将其缩短为O(NlogN)时间。

可以扩展上面的算法以确定顶点。

<强>详细信息:

Rectangle union

按如下方式修改事件处理:

在活动集中添加/删除边时,请注意边的起点和终点。如果任何一点位于已存在的活动集内,则它不构成顶点,否则就是。

通过这种方式,您可以找到合成多边形的所有顶点。

请注意,上面的方法可以扩展到一般多边形,但更多涉及。

答案 1 :(得分:1)

查看二进制空间分区(BSP)。

https://en.wikipedia.org/wiki/Binary_space_partitioning

如果你只有两个矩形,那么一些黑客可以产生一些结果,但是为了找到多个多边形的交叉点和联合,你需要实现BSP。

Schneider和Eberly的计算机图形几何工具的第13章介绍了BSP。请务必下载本书的勘误表!

Eberly是其中一位合着者,拥有一个精彩的网站,其中包含PDF和个别主题的代码示例:

https://www.geometrictools.com/

http://www.geometrictools.com/Books/Books.html

答案 2 :(得分:1)

对于一种相对简单可靠的方法,您可以按照以下方式工作:

  • 独立地对所有横坐标(垂直边)和纵坐标(水平边)进行排序,并丢弃任何副本。

  • 这将建立坐标和整数索引之间的映射。

  • 创建一个大小为NxN的二进制图像,填充黑色。

  • 对于每个矩形,在相应的索引之间填充白色图像。

  • 然后扫描图像以contour tracing找到角落,并恢复原始坐标。

enter image description here

此过程效率不高,因为它需要与N²成比例的时间加上矩形的(逻辑)区域的总和,但它对于适量的矩形可能很有用。它很容易处理巧合。

在两个矩形的情况下,可能没有太多不同的配置,您可以预先计算所有顶点序列以获得可能的配置(2 ^ 9个可能图像的一小部分)。

无需显式创建图像,只需将顶点序列与输入X和Y的可能排列相关联。

答案 3 :(得分:0)

就我个人而言,我认为应该解决这个问题,因为所有其他几何问题都在工程程序/语言,网格化中得到解决。 因此,首先将顶点转换为固定大小的矩形网格,例如: MatLab meshgrid 然后遍历所有网格元素并删除任何具有重复边元素的元素。现在将剩余网格的数量相加,并将其乘以您选择的网格区域。