沒有一種方法來填充在每一列的底部的間隙,因爲砌築排序在垂直順序的磚,然後在水平方向順序。它類似於裝箱算法,其中一些附加數學與樹圖算法類似。 bin-packing alogrithm的想法是儘可能減少固定數量磚塊堆積在柱子中所需的柱子數量。這是一個完整的問題,當然你在底部(或頂部)有間隙,這些間隙不能填充。
對於樹形圖,您可以使用kd樹。一個很好的描述在這裏:http://www.blackpawn.com/texts/lightmaps/default.html。
{
Node* child[2]
Rectangle rc
int imageID
}
Node* Node::Insert(const Image& img)
if we're not a leaf then
(try inserting into first child)
newNode = child[0]->Insert(img)
if newNode != NULL return newNode
(no room, insert into second)
return child[1]->Insert(img)
else
(if there's already a lightmap here, return)
if imageID != NULL return NULL
(if we're too small, return)
if img doesn't fit in pnode->rect
return NULL
(if we're just right, accept)
if img fits perfectly in pnode->rect
return pnode
(otherwise, gotta split this node and create some kids)
pnode->child[0] = new Node
pnode->child[1] = new Node
(decide which way to split)
dw = rc.width - img.width
dh = rc.height - img.height
if dw > dh then
child[0]->rect = Rectangle(rc.left, rc.top,
rc.left+width-1, rc.bottom)
child[1]->rect = Rectangle(rc.left+width, rc.top,
rc.right, rc.bottom)
else
child[0]->rect = Rectangle(rc.left, rc.top,
rc.right, rc.top+height-1)
child[1]->rect = Rectangle(rc.left, rc.top+height,
rc.right, rc.bottom)
(insert into first child we created)
return Insert(img, pnode->child[0])
您的htmlx和html5填充問題的問題很容易解釋。你有一個填充:8px;在html5文檔的body標籤中。所以圖像與每邊4px的周圍圖像之間存在差距。看到我的圖片:
你能解釋爲什麼它自然會在底部有空隙嗎?砌體中的每塊磚可以像牆壁一樣粘在一起,並且牆壁沒有間隙? – Bytemain 2012-07-20 00:34:43
是的,磚塊粘在一起,但看起來圖像高度的總和並不總是與容器的高度完全一樣,所以它的餘下部分變成了每一列底部的這些間隙。 – 2012-07-20 01:53:50