通过算法扩展框以填充 space

Algorithmically expanding a box to fill a space

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

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

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

如有任何想法,我们将不胜感激,

乔希

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

首先是遍历所有其他框。对于每个框 B,看看您可以将给定的框 Q 扩展多少(按什么因素),以便它会触及框 B;之后采取所有这些因素中的最小值。然而,为给定的 B 找到这个因子是一项不平凡的任务,尽管绝对可以解决。

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

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

but when I scale to meet its top edge, it is no longer contained

改为扩展以满足其

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

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

创建一个将比例因子作为参数的函数,并根据是否发现重叠将其设置为 return true 或 false。好像你已经写过类似这个函数的东西了。

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