【问题标题】:Algorithmically expanding a box to fill a space算法扩展一个盒子来填充一个空间
【发布时间】:2015-07-03 12:59:10
【问题描述】:

我有一个盒子对象数组,由它们的 (x,y,width,height) 属性定义,如下所示:

框 Q 锚定在角点 C。如何以编程方式扩展框 Q 以占用其所有可用空间,同时保持其纵横比?

通过将框扩展为非常大(从右上角)然后对齐到最远框的顶部边缘(在本例中为 5),我很幸运。如果此时其他框与 Q 重叠,我删除最远的框 (5) 并重复(对齐到 4 的顶部边缘),直到没有框重叠。这种方法的问题是一个框可能与 Q 重叠(下图中的框 2),但是当我缩放到它的顶部边缘时,它不再被包含,如下所示:

任何关于方法的想法将不胜感激,

乔什

【问题讨论】:

  • “如果有,我删除它们” --- 什么是“它们”?您不是要删除示例中的框 2 吗?
  • 编辑澄清,谢谢。
  • 除了顶边外,您还应该缩放以与右边缘相交,并检查哪一个实际相交,并选择较小的那个。在您的示例中,如果您通过扩展 Q 的底边以与 2 的顶边对齐来缩放 Q,则矩形不会相交。如果您通过扩展 Q 的左边缘来满足 2 的右边缘来缩放 Q,它们会相遇,所以这是实际的限制。如果两者都满足,请选择最小值。

标签: algorithm bin-packing


【解决方案1】:

但是当我缩放到它的顶部边缘时,它不再被包含

改为缩放以满足其要求

  1. 顶边
  2. 底边
  3. 左边缘
  4. 右边缘

然后,看看哪个缩放是有效的(缩放后包含框),结果是最大的框。

【讨论】:

  • 这可能不是最有效的方法,但它是一种有效的方法,谢谢 ciamej。
【解决方案2】:

我可以在这里看到两种方法。

首先是遍历所有其他框。对于每个框B,查看您可以将给定框Q 扩展多少(按什么因素),使其与框B 接触;之后采取所有这些因素中的最低限度。然而,为给定的B 找到这个因素是一项艰巨的任务,尽管绝对可以解决。

同时,如果您已经有一个代码可以检查给定因素的重叠,那么您可以应用二进制搜索来找到不会导致重叠的最大因素。

所以你知道,如果你将它扩展很多(比如x 次),它确实会重叠。如果不展开(即展开1 次),则不重叠。所以你有一个片段[1,x] 可以在哪里搜索答案。试试中间 --- 扩大(x+1)/2 倍,看是否重叠。如果重叠,则继续使用段 [1, (x+1)/2],否则使用段 [(x+1)/2, x]。取新段的中间,依此类推,直到段的结束值足够接近。

【讨论】:

    【解决方案3】:

    创建一个将比例因子作为参数的函数,并根据是否发现重叠返回真或假。看来您已经编写了类似的函数。

    然后使用二分搜索https://en.wikipedia.org/wiki/Bisection_method 找到您的比例因子,使其达到满意的阈值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2013-01-08
      • 2021-03-25
      • 2010-10-26
      相关资源
      最近更新 更多