2009-01-26 56 views
3

好吧,这里有一个小问题,我很想得到一些帮助。大小算法

我有一个视图,视口大小会根据用户屏幕分辨率而有所不同。该视口需要包含N个从右到左排列在一起的框,并占据视口中的所有水平空间。现在,如果所有的盒子都可以是相同的大小,这很容易,只需将视口宽度除以N即可。

问题是每个盒子都需要比它左手边的盒子小10%,所以例如,如果视口的宽度是271像素,并且有三个盒子我会返回[100,90,81 ]

所以我需要一个算法,当递交视口的宽度和水平框的数量将返回一个数组,其中包含每个框的宽度需要是为了填充视口的宽度和减少每个盒子的尺寸10%。

任何OO语言的答案都很酷。只想就如何解决这个问题得到一些想法,也许可以看看谁能够提出最优雅的解决方案。

问候,

克里斯

+0

箱子的最大数量(n)是多少? – 2009-01-26 12:59:34

+0

我问,因为如果n很小,您可能只想将值存储在查找表中。 – 2009-01-26 13:24:03

+0

n没有最大值,但实际上它不会超过20左右。 – ChrisInCambo 2009-01-26 13:39:45

回答

4

用一个简单的几何级数,在Python,

def box_sizes(width, num_boxes) : 
    first_box = width/(10 * (1 - 0.9**n)) 
    return [first_box * 0.9**i for i in range(n)] 

>>> box_sizes(100, 5) 
[24.419428096993972, 21.977485287294574, 19.779736758565118, 17.801763082708607, 16.021586774437747] 
>>> sum(_) 
100.00000000000001 

您可能要收拾精度,或转换成整数,但应该这样做。

3

这确实是一个数学问题。与给定的两箱:

X =尺寸的第一箱的 N =盒 P =像素数

然后

X + 0.9X = P

3号:X + 0.9X + 0.81x = P
4:X + 0.9X + 0.81x + 0.729x = P

是,事实上,一个几何级数形式:

S(N)= A + AR + AR Ñ + ... + AR n-1个

其中:

一个=尺寸的第一箱的
R = 0.9
S(N)= P

S(N)= A(1-R ñ)/(1-R)

所以

X = 0.1P /(1-0.9 ñ

这(最后!)似乎是正确的,并可以解决任何(P,N)。

+0

-1 ... f(n)是错误的 – Greg 2009-01-26 13:12:17

0

从计算盒子宽度的总和开始,假设第一个盒子是1,第二个盒子是0.81等。您可以迭代地或从几何系列的公式中进行此操作。然后通过(视口宽度)/(原始框的宽度之和)比率来缩放每个框。

2

它被称为Geometric Progression,它上面有一个Wikipedia article。公式也在那里。我认为cletus与他的f(n)犯了一个错误。已更正。 :)

1
Let: 
x = size of the first box 
n = number of boxes 
P = number of pixels 

n = 1: x = P 
n = 2: x + .9x = P 
n = 3: x + .9x + .81x = P 

P = x sum[1..n](.9^(n - 1)) 

Therefore: 
x = P/sum[1..n](.9^(n - 1)) 

Using the Geometric Progression formula: 
x = P (.9 - 1)/((.9^n) - 1)) 

Test: 
P = 100 
n = 3 
Gives: 
x = 36.9 
1
public static int[] GetWidths(int width, int partsCount) 
    { 
     double q = 0.9; 
     int[] result = new int[partsCount]; 

     double a = (width * (1 - q))/(1 - Math.Pow(q, partsCount)); 

     result[0] = (int) Math.Round(a); 
     int sum = result[0]; 

     for (int i = 1; i < partsCount - 1; i++) 
     { 
      result[i] = (int) Math.Round(a * Math.Pow(q, i)); 
      sum += result[i]; 
     } 

     result[partsCount - 1] = width - sum; 

     return result; 
    } 

这是因为它是geometric progression

0

和其他人一样,盒子的宽度构成geometric progression。鉴于视口宽度W和盒子数量N,我们可以直接解决为最宽盒子的宽度X。为了适应视口内ñ盒,我们需要

X + 0.9 X + 0.9^2 X + ... + 0.9 ^(ñ -1)X < = W¯¯

{1 + 0.9 + 0.9^2 + ... + 0.9 ^(ñ -1)} X < = W¯¯

应用公式用于以几何级数的总和给出

(1 - 0.9^ÑX /(1 - 0.9)< = W¯¯

X < = 0.1 /(1 - 0.9^Ñ

所以你有它,一个封闭形式的表达式,让你的最宽的框X的宽度。