黑色的矩形是一组矩形,而红色的矩形是产生最小可能面积的边界框(最多3个)。需要找出最佳的边界框组合。
对于大多数三个矩形,一切都将始终定位和对齐于x-y轴,并且没有重叠吗?你很幸运,有O(n2)
组这样的三个矩形,并且使用O(n3)
的工作量很容易枚举它们。考虑到您处理的黑色矩形数量足够小以进行可视化显示,枚举它们并选择最佳矩形应该足够快。
首先让我们考虑两个边界矩形的情况,因为它更简单。将图片投影到x轴很容易,也可以将图片投影到y轴。这两个投影中至少有一个将具有可见的间隙而没有重叠。因此,我们可以通过首先将所有黑色矩形投影到x轴上的线段上,查找间隙,并为每个间隙重构我们得到的两个边界框之一来枚举将其分成两个矩形的可能方法。然后使用y轴重复该过程。这样我们就可以得到它们全部。
现在,三个边界矩形的情况类似。事实证明,如果给定沿着x-y轴定向的3个不重叠的矩形,则x投影或y投影必须具有可见间隙。因此,我们可以执行与之前相同的过程,但是不仅构造一对边界框,而且尝试使用相同算法将另一个分成2个。
(顺便说一下,你很幸运只想要3个。这种方法在4个边界矩形的情况下会崩溃。因为那时可能有4个边界矩形,使得x投影和y投影都没有任何可见间隙。)
那么,我们如何将n个黑色矩形投影到一个轴上(假设为x轴),并寻找边界矩形集?您只需对其进行排序,构造最大重叠区间,并查找间隙。就像这样:
function find_right_boundaries_of_x_gaps (rectangles) {
var ordered_rect = rectangles.sort(function (r1, r2) { return r1.x1 <=> r2.x2 });
var gaps = [];
var max_right = ordered_rect[0].x2;
for (var i = 0; i < ordered_rect.length; i++) {
if (max_right < ordered_rect[i].x1) {
gaps.push(max_right);
}
if (max_right < ordered_rect[i].x2) {
max_right = ordered_rect[i].x2;
}
}
return gaps;
}
给定一个间隙,很容易找出每一侧所在的矩形边界框。如果您有有序矩形,则更加简单。
有了这些部分,现在您应该能够编写代码了。不幸的是,朴素的方法让您在构建大量重复代码或构造大量大型数据结构之间做出选择。但是,如果您熟悉闭包,可以用两种非常不同的方式解决这两个问题。
第一种方法是构造闭包,当调用时,它们会迭代您想要的各种数据结构。参见http://perl.plover.com/Stream/stream.html以获取灵感。这里的想法是编写一个函数,该函数接受一组矩形并返回一对边界框的流,然后再编写一个函数,该函数接受一组矩形,获取一对边界框的流,并返回三元组的边界框的流。然后有一个过滤器,获取该流并找到最佳的那个。
另一种方法则与之相反。而不是返回一个可以迭代可能性的函数,而是传入一个函数,通过可能性进行迭代,并在每个可能性上调用该函数。(该函数也可能进行进一步的迭代)。如果您对Ruby中的blocks有所了解,这种方法可能会让您感觉很合理。这是一个相当直接的例子。想法是像MST一样“增长”你的边界框。我觉得这个问题类似于MST,只不过我们有多达3个不相交的树,这显著增加了复杂性。
该算法需要大约(n choose 3)*(3*n)步,或O(n^4)。
最初,这似乎并不是最优的——在步骤2.2中添加剩余矩形的顺序会影响你得到的边界框大小——但当你选择一个新的三个矩形组合作为起始集时,它应该能够捕捉到更好的配置。
难道没有唯一的最小边界矩形吗?只需在所有矩形中取最大和最小的x和y坐标,然后根据这些规格制作一个矩形即可。
我同意"mu is too short"之前的评论。解决您问题的一种算法可以根据每对"黑色"矩形之间距离的水平和垂直分量的乘积(这将给出每个对之间形成的假想“红色”矩形的面积),将所有现有的“黑色”矩形划分为一个至三个几何聚类,并将每个结果集绑定到一个“红色”矩形。
无论您选择哪种几何聚类算法来解决该问题的组件(下面更详细介绍),重要的是您不要使用“直接”或欧几里得距离来将“黑色”矩形分成聚类,因为您的问题涉及缩小边界(“红色”)矩形的面积。正如我在前一段中提到的,您需要乘以每对“黑色”矩形之间距离的水平和垂直分量,以考虑可能的边界“红色”矩形将覆盖的区域。
文献中有许多几何聚类算法,它们具有不同的时间空间复杂度权衡。我建议您从这个谷歌搜索开始,并熟悉这些算法。或者,您可以使用遗传算法或模拟退火算法来解决此问题,而无需使用聚类算法。在这种情况下,将尝试并测量各种组合和可能的边界“红色”矩形的总面积,以产生最佳解决方案。
如有需要,请随时要求任何澄清,并祝您的项目好运!