完美填充一个带有较小矩形列表的矩形

时间:2018-01-13 12:45:26

标签: javascript algorithm rectangles

我想采用一个边界矩形和一个其他矩形(x,y,宽度,高度)的列表,这些矩形可能相互重叠或边界重叠并移动/调整它们以完全适合边界内部,不留空格或重叠。

我搜索了Google,Stack Exchange和其他资源,找不到此算法的名称,更不用说实现了。有没有一种标准的实现方法?

这是我希望算法可以做的: Reconciling rectangles

其他想法:

  1. 我使用的是Javascript,但是使用任何语言的参考实现 会有所帮助
  2. 如果发生重叠,任何调整矩形大小的方法都可以 但我可能会选择重叠的中点
  3. 最终的矩形可以是任何大小,包括一维中的0,只要长 因为它们都符合界限
  4. 我的数据的边界和矩形归一化为0-1范围, 其中0,0是边界的左上角,1,1是底部 右角

2 个答案:

答案 0 :(得分:1)

与您的问题相关的着名问题是“托盘装载”问题。通常,这个问题的复杂性类别是未知的,并且是一个开放的问题。您可以在this article中了解有关问题及其变体的更多信息。

答案 1 :(得分:0)

这似乎是找到给定矩形的布局结构的问题。

矩形的一般布局可以是任何类型,例如他的problem,这可能很难解决。我会通过定义简单的布局模型来解决这个问题,该模型可用于将输入数据转换为它,然后使用该布局数据来填充输入边界矩形。

最简单的布局是将盒子水平或垂直堆叠成两个盒子。在您的示例中,边界矩形分为两个水平堆叠的框。右边的一个被分成垂直堆叠的盒子,其中一个被水平分割。

为给定的矩形集创建布局的主要步骤是找到划分最佳矩形集的水平或垂直线。之后,同样的方法应用于通过分割产生的两组矩形。

创建布局结构后,通过从下到上递归合并框来计算相对大小,很容易找到矩形的大小和位置。比从上到下传播位置和大小。

此布局的改进是允许水平或垂直堆叠更多框的布局。结果是相同的,但这种方法可能更快,因为需要更少的迭代查找分裂线。