我正在尝试使用最多3个区域来实现重绘区域,但是在给定一组矩形的情况下无法想出找到最佳区域集的有效方法。
因此会有一组矩形,我需要计算最多3个产生最小区域的边界矩形。
黑色矩形是一组矩形,而红色矩形是产生最小可能区域的边界框(最多3个)。需要找出最佳的边界框组合。
答案 0 :(得分:1)
这是一个相当简单的例子。我的想法是“增长”您的边界框,就像MST一样。我觉得问题类似于MST,除了我们有多达3个不相交的树,这显着增加了复杂性。
该算法需要大约(n选3)*(3 * n)步,或O(n ^ 4)。
最初,它似乎不是最佳的 - 在步骤2.2中添加剩余矩形的顺序会影响您获得的边界框大小 - 但是当您选择三个矩形的新组合作为开始时设置它应该捕获更好的配置。
答案 1 :(得分:1)
作为大多数3个矩形,一切都将在x-y轴上定向和对齐,并且没有重叠?你很幸运,有O(n2)
组3个这样的矩形,用O(n3)
工作很容易枚举它们。鉴于您正在处理足够数量的黑色矩形以进行视觉显示,将它们全部枚举并选择最佳矩形应该足够快。
首先让我们考虑2边界矩形情况,因为它更简单。将图像投影到x轴很容易,也可以很容易地将图像投影到y轴。这两个投影中的至少一个将具有可见的间隙而没有重叠。因此,我们可以列举分成两个矩形的可能方法,首先将所有黑色矩阵投影到x轴上的线段,寻找间隙,并为每个间隙重建我们得到的哪一对边界框。然后用y轴重复该过程。我们将全部收到它们。
现在3个边界矩形的情况类似。事实证明,给定3个沿x-y轴取向的非重叠矩形,x投影或y投影必须具有可见间隙。所以我们可以像以前一样执行相同的过程,但是我们不是仅构造一对边界框,而是尝试构造一个边界框,并使用相同的算法将另一个分成另外两个边框。
(顺便说一句,你很幸运,你只想要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;
}
考虑到差距,可以直接找出每个边上的2个矩形边界框。 (如果您使用有序的矩形,则更直接。)
使用这些部分,您现在应该能够编写代码了。不幸的是,天真的方法可以让你在构建大量重复代码之间做出选择,或者必须构建大量的大型数据结构。但是,如果您对闭包感到满意,可以用两种截然不同的方式解决这两个问题。
第一个是构造闭包,当被调用时,它将遍历您想要的各种数据结构。请参阅http://perl.plover.com/Stream/stream.html获取灵感。这里的想法是你编写一个函数,它接受一组矩形并返回一对边界框,然后另一个函数接受一组矩形,得到一对边界框的流,并返回一个三元组流边界框。然后有一个过滤器来获取该流并找到最佳的流。
另一个是内在的。而不是返回一个可以迭代可能性的函数,传入一个函数,迭代各种可能性,并在每个可能性上调用函数。 (所述函数也可以进行进一步的迭代。)如果你对Ruby中的块有任何接触,这种方法对你来说可能很有意义。
如果你不熟悉闭包,你可能希望忽略最后几段。
答案 2 :(得分:0)
是不是有一个独特的最小边界矩形?只需在所有矩形中取最大和最小x和y坐标,然后根据这些规范制作矩形。
答案 3 :(得分:0)
我同意之前的评论“mu太短”。解决您的问题的一种算法可以将所有现有的“黑色”矩形划分为一到三个几何簇,基于每对“黑色”矩形之间距离的水平和垂直分量的乘法(这将给出每对之间形成的假设“红色”矩形的区域,然后将每个结果簇与“红色”矩形绑定。
无论您选择哪种几何聚类算法来解决问题的组成部分(详见下文),重要的是不要使用“直线”或欧几里德距离将“黑色”矩形划分为聚类。每对作为参数,因为您的问题涉及减少边界(“红色”)矩形的区域。正如我在前面的段落中提到的,你需要乘以每对“黑色”矩形之间距离的水平和垂直分量,以便考虑区域一个可能的边界“红色”矩形将覆盖。
文献中有许多几何聚类算法,具有不同的时空复杂度权衡,我建议你从this Google search开始并熟悉这些算法。或者,可以通过使用genetic或simulated annealing算法在不使用聚类算法的情况下解决此问题,在这种情况下,各种组合的总面积和可能的边界“红色”矩形的数量将尝试和测量,以产生最佳解决方案。
随意询问任何需要的澄清,祝你的项目好运!