调整列算法

时间:2009-12-08 22:30:57

标签: algorithm math graphics

我有一组不同宽度的列,我需要一个算法来重新调整它们的大小y值,这个值大于它们所有宽度的总和。

我希望算法优先考虑均衡宽度。因此,如果我有一个绝对巨大的值,那么列的最终宽度大致相同。如果没有足够的空间,我希望优先考虑较小的细胞。

任何奇怪的想法?我更喜欢简单的东西:

getNewWidths(NewWidth, ColumnWidths[]) returns NewColumnWidths[]

3 个答案:

答案 0 :(得分:3)

伪代码:

w = NewWidth
n = ColumnWidths.count
sort(ColumnWidths, ascending)
while n > 1 and ColumnWidths[n-1] > (w/n):
    w = w - ColumnWidths[n-1]
    n = n - 1
for i = 0 to n-1:
    ColumnWidths[i] = w / n

你需要添加一些代码来重新分配来自w / n计算的任何舍入,但我认为这样做。

答案 1 :(得分:3)

Mark Ransom的回答给出了正确的算法,但是如果你在弄清楚那里发生了什么,这里是Python中的实际实现:

def getNewWidths(newWidth, columnWidths):
    # First, find out how many columns we can equalize
    # without shrinking any columns.
    w = newWidth
    n = len(columnWidths)
    sortedWidths = sorted(columnWidths)   # A sorted copy of the array.
    while sortedWidths[n - 1] * n > w:
        w -= sortedWidths[n - 1]
        n -= 1

    # We can equalize the n narrowest columns. What is their new width?
    minWidth = w // n    # integer division
    sparePixels = w % n  # integer remainder: w == minWidth*n + sparePixels

    # Now produce the new array of column widths.
    cw = columnWidths[:]   # Start with a copy of the array.
    for i in range(len(cw)):
        if cw[i] <= minWidth:
            cw[i] = minWidth
            if sparePixels > 0:
                cw[i] += 1
                sparePixels -= 1
    return cw

答案 2 :(得分:0)

我会分两步对它进行分解,首先决定你想要多少均衡(在0和1之间),然后只调整它以适应新的总宽度。

例如在

def get_new_widths new_total, widths
  max = widths.max
  f = how_much_equalizing(new_total) # return value between 0.0 and 1.0
  widths = widths.collect{|w| w*(1-f)+max*f}
  sum = widths.inject(0){|a,b|a+b}
  return widths.collect{|w| w/sum*new_total}
end

def how_much_equalizing new_total
  return [1.0, (new_total / 2000.0)].min
end