我有一个盒子对象数组,由它们的(x,y,width,height)属性定义,如下所示:
Box Q锚定在角点C.如何以编程方式扩展box Q以占用它所拥有的所有可用空间,同时保持其宽高比?
通过将盒子扩展到非常大(从右上角)然后对齐到最远的盒子的顶部边缘(在这种情况下为5),我有一些运气。如果此时其他框与Q重叠,则移除最远的框(5)并重复(对齐到4的顶边),直到没有框重叠。这种方法的问题是一个框可能与Q重叠(下一个图像中的框2),但是当我缩放以满足其顶边时,它不再包含,如下所示:
非常感谢对方法的任何想法,
约什
答案 0 :(得分:2)
但是当我缩放以达到其最高优势时,它不再包含
相反缩放以满足其
然后,查看哪个缩放有效(缩放后包含该框)并生成最大的框。
答案 1 :(得分:1)
我可以在这里看到两种方法。
首先是迭代所有其他框。对于每个框B
,请查看您可以展开给定框Q
的多少(按什么因素),以便它会触及框B
;之后采取所有这些因素的最小化。但是,为给定的B
找到这个因子是一项非常重要的任务,尽管可以解决。
同时,如果您已经有一个代码检查给定因子的重叠,那么您可以应用二进制搜索来找到不会导致重叠的最大因子。
所以你知道如果你扩展它(比如x
次),它确实会重叠。如果您不展开它(即,展开1
次),它不会重叠。所以你有一个段[1,x]
在哪里搜索答案。尝试中间---按(x+1)/2
次展开,看看它是否重叠。如果它重叠,请继续使用细分[1, (x+1)/2]
,否则使用细分[(x+1)/2, x]
。取新段的中间部分,依此类推,直到段的结束值足够接近。
答案 2 :(得分:1)
创建一个函数,该函数将缩放因子作为参数,并根据是否找到重叠返回true或false。看起来你已经有了这样的功能。
然后使用二分搜索https://en.wikipedia.org/wiki/Bisection_method将您的缩放系数找到满意的阈值。