矩形内最大的空矩形

时间:2013-03-16 12:06:17

标签: c# .net algorithm dynamic-programming

我的数学不是很好,所以我很难将公式转换成代码,而且我找不到任何现成的谷歌搜索。我有一个包含很多小矩形的大矩形......我需要做的就是计算最大的空矩形。 Anyonne可以帮帮我吗?

这就是我想出的......没什么可说的,这是一个很大的失败。

Rect result = new Rect();

for (Double l = 0; l < bigRect.Width; ++l)
{
    for (Double t = 0; t < bigRect.Height; ++t)
    {
        Double h = 0;
        Double w = 0;

        while ((h <= bigRect.Width) && (w <= bigRect.Height))
        {
            Rect largestEmpty = new Rect(l, t, w, h);

            if (smallRects.TrueForAll(smallRect => !smallRect.IntersectsWith(largestEmpty)) && ((largestEmpty.Height * largestEmpty.Width) > (result.Height * result.Width)))
                result = largestEmpty;
            else
                break;

            ++h;
            ++w;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

从你的Perdue Docs Link开始,它说Big Rect中有一个点(让我们称之为ASD),你会发现最大的Rect不包含集合ASD的点。看看你的代码,似乎你没有(直接)合并这些要点。我将从较小的Rects和创建集合ASD中提取点。由于您使用的是double类型,因此您应该可以访问这些点,否则算法将具有明显更长的运行时间,因为您需要检查特定范围内的所有可能的双精度(整个Big Rect)。使用这些点,我会尝试找到彼此距离最短的点(sqrt(dx ^ 2 + dy ^ 2))(最短点不应包含任何点)然后转到下一个最短点并查看是否有任何点换句话说,创建所有组合的顺序列表(不是排列,(a,b)到(c,d)应该是==(c,d)到(a,b))按距离排序在他们之间。可能不是最佳,但完成工作。

编辑:除了较小的Rects的对角线之外的所有订单对都应该在订单列表中,因为不应该包含较小的Rects,您也可以排除具有相同x或y值的对。