【发布时间】:2015-12-22 18:10:50
【问题描述】:
我有一个问题,最好用计算机屏幕上的窗口来说明:创建另一个窗口,尽可能大,不要与任何现有窗口重叠。
换句话说:给定有限表面(一张纸或屏幕)上的一组 N 个矩形,找到可以放在这些矩形之间的最大矩形。 (坐标可以是任意的,所以位图在这里不是一个可行的解决方案。)
下图显示了三个矩形(黑色)和可以拟合的最大矩形(红色)。
http://www.irstafoto.se/blogmtrl/rectangle-illustration.jpg
我为此编写了一个简单的算法,它考虑了矩形使用的所有 x 和 y 坐标对。不幸的是,它是 O(N^5),因为在最坏的情况下,必须检查每个矩形候选者是否与其他矩形重叠。
还有什么更好的吗?
最大面积 = 0; max_rect = 无 xc = 图片中的所有矩形 x 坐标 [x1, ..., x6]) yc = 所有矩形 y 坐标(图片中的 y1, ..., y6]) xc = [0] + xc + [W]; /* W 是区域的宽度 */ yc = [0] + yc + [H]; /* H 是区域的高度 */ 排序(xc); 排序(yc); 对于 xc 中的每个 x0 对于 xc 中的每个 x1 > x0 对于 yc 中的每个 y0 对于 yc 中的每个 y1 > y0 r = 矩形(x0,y0,x1,y1) if (area(r) > max_area and !overlapping(r)) max_area = 面积(r) max_rect = r【问题讨论】:
-
是的。使用“扫描线算法”可以做得更好,这是正确的谷歌搜索词。
标签: algorithm computational-geometry rectangles