2

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

在此处输入图像描述 框 Q 锚定在角点 C。我如何以编程方式扩展框 Q 以占用它拥有的所有可用空间,同时保持其纵横比?

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

在此处输入图像描述

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

乔什

4

3 回答 3

2

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

而是扩展以满足其

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

然后,查看哪个缩放有效(缩放后包含框)并产生最大的框。

于 2015-07-03T13:50:15.257 回答
1

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

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

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

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

于 2015-07-03T13:43:20.157 回答
1

创建一个将比例因子作为参数的函数,并根据是否发现重叠返回 true 或 false。似乎您已经编写了类似此函数的内容。

然后使用二等分搜索https://en.wikipedia.org/wiki/Bisection_method将您的比例因子找到一个令人满意的阈值。

于 2015-07-03T13:53:34.633 回答