【发布时间】:2017-02-14 20:29:16
【问题描述】:
我有有限的二维空间,双向坐标(我的意思是向左会环绕到右边缘,向上/向下也是如此)。
我还有一组与轴对齐的框。这些框在空间内具有浮点坐标。
问题:找到与包围所有框的轴对齐的最小边界框。边界框可以被环绕。
样品:
(粉色表示空间边界,红色框需要包围,蓝色边界表示最小可能的边界框)
【问题讨论】:
标签: algorithm 2d bounding-box
我有有限的二维空间,双向坐标(我的意思是向左会环绕到右边缘,向上/向下也是如此)。
我还有一组与轴对齐的框。这些框在空间内具有浮点坐标。
问题:找到与包围所有框的轴对齐的最小边界框。边界框可以被环绕。
样品:
(粉色表示空间边界,红色框需要包围,蓝色边界表示最小可能的边界框)
【问题讨论】:
标签: algorithm 2d bounding-box
可以使用扫描算法来找到最大的垂直间隙,即最远的两条垂直线,它们之间没有框。
同样,可以使用扫描算法来找到最大的水平间隙。显然,两个间隙都可以环绕边缘。
从 2D 空间中移除间隙后留下的形状是包含所有框的最小边界框。我不确定它是否保证在所有包含框中具有最小的 area,但不存在 both 尺寸小于此尺寸的边界框。如果存在,它将定义两个间隙(垂直和水平),两者均大于最大间隙。
检测两个间隙的扫描可以在 O(N * log N) 中完成,其中 N 是框的数量。
【讨论】:
边界框包围的总面积的百分比为:
边界框包围的总面积的百分比=(水平边界包围的水平范围的百分比)*(垂直边界包围的垂直范围的百分比)
显然考虑到包装。因此,您可以独立地最小化水平和垂直边界,以最小化总面积。
要最小化水平边界,您需要找到一个矩形的右边缘和下一个矩形的左边缘之间的最大间隙。您可以通过将所有边(左和右)排序到一个列表中并遍历它来有效地做到这一点,当你得到左边时增加计数,当你得到右边时减少计数。当计数从 0 -> 1 时,您的最大间隙是 x 值的最大差异。您必须特别处理环绕案例,只需水平重复一次矩形,偏移宽度即可轻松做到这一点的总面积。在开始时初始化计数时,您还必须考虑环绕的矩形。
然后对垂直边界进行同样的操作。
【讨论】: