比较来自世界各地的卖家的域名和 IT 服务价格

基于N元素,总面积和比率创建最佳网格 H:W

我创建一个应用程序,该应用程序需要多个相同大小的矩形,并将它们放在屏幕上的网格中。 我有很大的逻辑,可以在单元格中更改矩形的大小和居中,但我对实际部分有问题,它定义了匹配矩形的网格。

理想情况下,最终,我会有这样的功能 /伪码/:


function getGridDimensions /rect surface, int numItems, float hwRatio/ {
// do something to determine grid-height and grid-width
return gridDimensions;
}


我对此问题的初步打击包括如此:


gridHeight = surface.width / sqrt/numItems/;
gridWidth = surface.height / sqrt/numItems/;


如果我的所有元素都是完美的正方形,这将是良好的,但由于它们是矩形,因此每个细胞仍然存在很多未使用的白色空间。

任何想法或术语 Google, 谁能告诉我正确的方向?
已邀请:

江南孤鹜

赞同来自:

在一些输入参数中,我有点不清楚,但我假设你有矩形的高度和宽度,矩形的数量和完美的高度和宽度比 /即首选 gridheight/gridwidth/.

如果是这样,那么我可能会开始 "normalizing" 我们说以下计算的目标是宽度单元等于矩形的宽度,以及高度单元。 如果高度比率/实体单位的宽度 " 到 " - 价值高度/矩形单元的宽度将 k*RectWidth/RectHeight. 我会称之为。

所以,现在按定义的每个矩形都有一个区域 1, 所以我们的总面积是平等的 N, 在哪里 N - 元素的数量。 然后我们可以通过说来带来我们的身高和宽度以获得优选的宽高比。 gridHeight*gridWidth = N 和 gridHeight/gridWidth = K

他们的帮助我们得到了 gridHeight = sqrt /KN/ 和 gridWidth = sqrt/N/K/.

如果您将其中一个人舍入合适的整数 /我不确定最近的圆形数字将为您提供最佳结果,或者它的舍入将提供此值的最低百分比变化。 - 如果对您如此重要,您可以随时尝试所有四个。/. 一旦您有一个整数值,那么您就可以计算了另一个,找到了最小的整数,可以多于另一个,仍然更多 N, 要确保将所有矩形放入网格中/.

当然,您可以将整数值更改为真实,乘以高度 rectHeight 和 wdith 在 RectWidth.

我希望这一切都有意义。 :/

编辑为例

:

所需的最终纵横比 = 1024/768 /k/ /假设768是宽度和1024高度 - 我想把它相反,作为标准屏幕分辨率 :/ /

"Normalised" 宽高比 = /1024/768/ * /300/109/ = 3.6697 /K/

所以网格是高度 sqrt/KN/ = 根/366.97/ = 19.16

网格宽度 sqrt/N/K/ = 5.22

看着它,我们直观地看到宽度 5 和身高 20 会有最好的巧合。 其他选择可以 6 和 19. 但它会花更多的空间 /我认为,也许,事实上,最大限度地减少了这里的宽度和高度的工作将是最好的计算,但我不确定/.

现在这是我们在细胞中网格的大小。 然后它缩放到像素大小 1500 在 2180. 缩放以适应 768x1024, 意味着除去 2.129 /更多的 1500/768 和 2180/1024/., 所以你的图像将减少 2.129 一旦做 141x51 /ish/, 并且总使用的区域实际上是 705x1020, 什么应该得到最少的 whitespace.

我希望现在有更多的意义。 我承认我弄错了几次,把真正的值弄错了,所以我完全明白你为什么需要一个工作的例子。 ;-/

小姐请别说爱

赞同来自:

因此,我认为我有一个可以获得具有蛮力的最佳响应的算法。 它仍然应该足够快 100-1000 项目。 这是算法B. python. 它基本上通过各种方式来分发行和列上的元素,然后选择一个具有最大效率的方法。


def calculate_best_screen_packing/N, img_resolution = /800,600/, screen_resolution = /1920, 1080//: 
screen_x = screen_resolution[0]
screen_y = screen_resolution[1]
screen_area = screen_x * screen_y

img_x = img_resolution[0]
img_y = img_resolution[1]
img_aspect = img_x / img_y

best_dims = /None,None/
best_eff = 0.0

for n_rows in range/1,N//2 +1/:
#print/i/
n_cols = N // n_rows
if N % n_rows != 0: n_cols = n_cols+1

#print/n_rows, n_cols/

# Test by maximising image height
img_y_scaled = screen_y / n_rows
img_x_scaled = img_y_scaled * img_aspect
img_area_scaled = img_x_scaled * img_y_scaled
eff = img_area_scaled * N / screen_area
#print/img_x_scaled, img_y_scaled, eff/

if eff <= 1.0 and eff > best_eff:
best_eff = eff
best_dims = /n_rows, n_cols/

# Test by maximising image width
img_x_scaled = screen_x / n_cols
img_y_scaled = img_x_scaled / img_aspect
img_area_scaled = img_x_scaled * img_y_scaled
eff = img_area_scaled * N / screen_area
#print/img_x_scaled, img_y_scaled, eff/
if eff <= 1.0 and eff > best_eff:
best_eff = eff
best_dims = /n_rows, n_cols/

#print/"Best dims:",best_dims,best_eff/
return best_dims

要回复问题请先登录注册