Algorithm 找到一个最佳的n平方大小(每个都相同),以适合矩形容器的大部分

Algorithm 找到一个最佳的n平方大小(每个都相同),以适合矩形容器的大部分,algorithm,math,user-interface,resize,geometry,Algorithm,Math,User Interface,Resize,Geometry,输入 矩形区域的宽度和高度,因此我们可以计算矩形纵横比 N是我们想要调整大小的方块数,每个方块的大小都相同 输出 找到最适合集装箱大部分的正方形尺寸。比如说 containerWidth = 200; containerHeight = 100; n = 8; 在这种情况下,Squaresize应为50以适合大部分矩形区域 我尝试的 我已经尝试过计算容器数学面积,然后将其除以平方数,通过平方根得到每个平方面积。但这是理想的正方形大小,因此它不考虑相对于容器矩形的每个正方形位置 真正的紫色 我试

输入

矩形区域的宽度和高度,因此我们可以计算矩形纵横比

N是我们想要调整大小的方块数,每个方块的大小都相同

输出

找到最适合集装箱大部分的正方形尺寸。比如说

containerWidth = 200;
containerHeight = 100;
n = 8;
在这种情况下,Squaresize应为50以适合大部分矩形区域

我尝试的

我已经尝试过计算容器数学面积,然后将其除以平方数,通过平方根得到每个平方面积。但这是理想的正方形大小,因此它不考虑相对于容器矩形的每个正方形位置

真正的紫色


我试图制作可缩放的用户界面,这将在矩形容器中绘制尽可能多的方形对象。

您必须解决不等式(找到a的最大值)

其中div是带截断的整数除法(8 div 3=2)

结果单调依赖于n,所以得到一阶近似值为

a = Sqrt(W*H/n)

并通过线性或二进制搜索找到精确值

S
为每个正方形的大小(宽度和高度)。然后你要解决优化问题

  maximize S
subject to floor(Width / S) * floor(Height / S) >= n
           S >= 0
可行域是一个范围
[0,S*]
,其中
S*
是最优解


我们知道
S*S*n线性搜索似乎很慢。有更好的二次近似吗?@Jan Dvorak,但二进制搜索是快速的,这与我的答案有很大不同:)@MBo你的答案有正确的想法支持,但没有充分解释为什么它有效。不等式
(Width div a)*(Height div a)>=n
也不是100%正确的,因为它假设了整数大小,这似乎不是故意的。
  maximize S
subject to floor(Width / S) * floor(Height / S) >= n
           S >= 0