如何计算两个(或更多)矩形的并集多边形
How to compute the union polygon of two (or more) rectangles
例如,我们有两个矩形,它们重叠。我想得到它们并集的确切范围。计算这个的好方法是什么?
这是两个重叠的矩形。假设顶点的绳索都是已知的:
如何计算联合多边形顶点的线?如果我有两个以上的矩形怎么办?
查看 二进制 space 分区 (BSP)。
https://en.wikipedia.org/wiki/Binary_space_partitioning
如果您只有两个矩形,那么稍微修改一下可能会产生一些结果,但是要查找多个多边形的交集和并集,您需要实施 BSP。
Schneider 和 Eberly 的 计算机图形学几何工具 的第 13 章介绍了 BSP。请务必下载本书的勘误表!
Eberly,合著者之一,有一个很棒的网站,其中包含针对各个主题的 PDF 和代码示例:
存在一个Line Sweep Algorithm来计算n个矩形并集的面积。有关算法的详细信息,请参阅link。
如文章所述,存在一个布尔数组实现,时间复杂度为O(N^2)。使用正确的数据结构(平衡二叉搜索树),可以减少到O(NlogN)时间。
上述算法也可以扩展为确定顶点。
详情:
修改事件处理如下:
当你add/remove将边设置为活动时,记下边的起点和终点。如果任何点位于已经存在的活动集内,则它不构成顶点,否则构成顶点。
这样你就可以找到合成多边形的所有顶点。
请注意,上述方法可以扩展到一般多边形,但涉及更多。
比较简单可靠的方法,可以按如下操作:
独立排序所有横坐标(垂直边)和纵坐标(水平边),并丢弃任何重复项。
这就建立了坐标和整数索引之间的映射。
创建一个大小为 NxN 的二值图像,用黑色填充。
对于每个矩形,在相应索引之间用白色填充图像。
再扫描图片找到角点,按contour tracing,还原为原坐标
这个过程效率不高,因为它花费的时间与 N² 加上矩形的(逻辑)面积之和成正比,但它对于适量的矩形很有用。它很容易处理巧合。
在两个矩形的情况下,没有那么多不同的可能配置,您可以预先计算所有顶点序列以获得可能的配置(2^9 可能图像的一小部分)。
无需显式创建图像,只需将顶点序列关联到输入 X 和 Y 的可能排列即可。
我个人认为这个问题应该像在工程 programs/languages 中解决所有其他几何问题一样得到解决,网格划分。
因此,首先将您的顶点转换为固定大小的矩形网格,例如:
MatLab meshgrid
然后遍历所有网格元素并删除任何具有重复边缘元素的元素。现在将剩余网格数相加并乘以您选择的网格面积。
例如,我们有两个矩形,它们重叠。我想得到它们并集的确切范围。计算这个的好方法是什么?
这是两个重叠的矩形。假设顶点的绳索都是已知的:
如何计算联合多边形顶点的线?如果我有两个以上的矩形怎么办?
查看 二进制 space 分区 (BSP)。
https://en.wikipedia.org/wiki/Binary_space_partitioning
如果您只有两个矩形,那么稍微修改一下可能会产生一些结果,但是要查找多个多边形的交集和并集,您需要实施 BSP。
Schneider 和 Eberly 的 计算机图形学几何工具 的第 13 章介绍了 BSP。请务必下载本书的勘误表!
Eberly,合著者之一,有一个很棒的网站,其中包含针对各个主题的 PDF 和代码示例:
存在一个Line Sweep Algorithm来计算n个矩形并集的面积。有关算法的详细信息,请参阅link。
如文章所述,存在一个布尔数组实现,时间复杂度为O(N^2)。使用正确的数据结构(平衡二叉搜索树),可以减少到O(NlogN)时间。
上述算法也可以扩展为确定顶点。
详情:
修改事件处理如下:
当你add/remove将边设置为活动时,记下边的起点和终点。如果任何点位于已经存在的活动集内,则它不构成顶点,否则构成顶点。
这样你就可以找到合成多边形的所有顶点。
请注意,上述方法可以扩展到一般多边形,但涉及更多。
比较简单可靠的方法,可以按如下操作:
独立排序所有横坐标(垂直边)和纵坐标(水平边),并丢弃任何重复项。
这就建立了坐标和整数索引之间的映射。
创建一个大小为 NxN 的二值图像,用黑色填充。
对于每个矩形,在相应索引之间用白色填充图像。
再扫描图片找到角点,按contour tracing,还原为原坐标
这个过程效率不高,因为它花费的时间与 N² 加上矩形的(逻辑)面积之和成正比,但它对于适量的矩形很有用。它很容易处理巧合。
在两个矩形的情况下,没有那么多不同的可能配置,您可以预先计算所有顶点序列以获得可能的配置(2^9 可能图像的一小部分)。
无需显式创建图像,只需将顶点序列关联到输入 X 和 Y 的可能排列即可。
我个人认为这个问题应该像在工程 programs/languages 中解决所有其他几何问题一样得到解决,网格划分。 因此,首先将您的顶点转换为固定大小的矩形网格,例如: MatLab meshgrid 然后遍历所有网格元素并删除任何具有重复边缘元素的元素。现在将剩余网格数相加并乘以您选择的网格面积。