所以我有一个6m x 2.25m
的矩形,还有另外4个静态尺寸的矩形,它们被随机放置在全局矩形中。
我需要有一个函数,将计算最大的矩形的面积,可以容纳在外部矩形,也不会与其他矩形重叠。
我想过找出小矩形之间的最大x距离,但取决于它们是面向横向还是纵向的,x可能无法完成这项工作。在这一点上,我被困住了,我在网上找不到太多关于做这件事的东西,但我相信这对于有经验的程序员来说是一项相当普通的任务。
更新:这里是一个示例图像,显示了我正在尝试描述的内容。彩色矩形是随机放置的静态尺寸,我想找出适合的最大矩形。
耽误您时间,实在对不起!
发布于 2018-07-28 21:53:50
作为一个起点。在时间和空间复杂度上,较小矩形的数量是二次的。
高级方法
1)根据较小的子矩形(图中的紫线)的大小,将大矩形划分为子矩形。最优矩形的边框总是由这些子矩形组成。
2)标出不能作为最终结果一部分的填充子矩形(图中的红色和黄色矩形)
3)现在我们有了一个搜索问题。我们可以使用任何搜索算法(我使用的是DFS)。您可以对此进行优化(例如缓存),但为了简单起见:
伪码
frontier = queue(all subrectangles)
largest_area = None
while frontier is not empty:
rectangle = pop a rectangle off frontier
if all subrectangles to the right of rectangle are unoccupied:
add (rectangle + extra subrectangles to the right) to frontier
largest_area = max(area of new rectangle, largest_area)
else if all subrectangles below rectangle are unoccupied:
add (rectangle + extra subrectangles below) to the frontier
largest_area = max(area of new rectangle, largest_area)
print largest_area
解释
假设矩形是绿色的矩形。可能的后继状态是添加带有蓝色星号的子矩形或添加带有粉红色星号的子矩形。然而,粉红色的星星与黄色的矩形重叠,所以我们不能添加它。
发布于 2018-07-28 22:56:26
最佳矩形是这样的:它与四边的其他矩形相接(否则,您可以放大它)。因此,您将把搜索限制在可用的坐标上。
暴力解决方案的工作原理如下:
对于每个(横坐标,纵坐标)组合,列出所有横坐标和坐标(包括外部界限)并对它们进行排序,找到将该点作为其左上角的最大矩形,如下所示:
- for every (abscissa', ordinate') combination such that abscissa' > abscissa and ordinate' > ordinate, use this point as the lower-right corner of the rectangle and test as follows:
- for every given rectangle, check if it overlaps the rectangle under test; if there is an overlap, ignore this candidate.
- if there were no overlaps, the candidate is accepted; compute its area and keep the largest so far.
对于N个矩形,这个过程需要O(N^5)次操作,所以它只适用于非常小的N个。
您可以通过将每个横坐标替换为其索引并在位图中表示矩形来加速这一过程。在这个位图中绘制每个缩小的矩形。
然后,当您想要测试候选矩形时,尝试右边最长的空像素;然后尝试下一行,找到不比前一行长的最长的空像素;以此类推到位图的底部(这可以确保您尝试所有可能的矩形)。每次尝试矩形时,检索原始坐标并计算真实面积。
下面是原始矩形,然后是压缩的位图表示和从标记的像素开始尝试的像素(尝试了四个矩形)。
发布于 2021-12-10 06:03:55
以下是我的方法:
,,
为了做到这一点,我使用了2个没有重复元素的排序数组:
- (x\_left\_top and x\_right\_top)
- (y\_left\_top and y\_left\_bottom)
类矩形{构造函数(left,top,width,height,area) { this.left = left;this.top = top;this.width = width;this.height = height;this.area = area;}}
所以现在我们有了子矩形的数组。,,
我们可以用这个函数检查矩形是否被占用。
//rects是彩色矩形的数组//rect1是上图中的每个矩形。函数isOverlap(rect1,rects){ for (let i= 0;i< rects.length;i++) { if (rectsi.left <= rect1.left && rect1.left < rectsi.left + rectsi.width && rectsi.top <= rect1.top && rectsi.top + rectsi.height) { return true;}} return false;}
现在我们有了带矩形的二维数组,我们知道它们的面积。,,
现在我们有问题了,您可以在中查看
https://stackoverflow.com/questions/51574829
复制