石積みはレンガを垂直方向に並べ替え、次に水平方向に並べ替えるため、各列の下部のギャップを埋める方法はありません。これは、ツリーマップ アルゴリズムに似た計算を追加したビン パッキング アルゴリズムに似ています。ビン パッキング アルゴリズムの考え方は、一定量のレンガを列に積み重ねるのに必要な列の数を最小限に抑えることです。これは np 完全な問題であり、当然、下部 (または上部) にギャップがあり、それらのギャップを埋めることはできません。
ツリーマップの場合、kd-tree を使用できます。適切な説明は、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 のパディングの問題に関する質問は簡単に説明できます。padding:8px; があります。html5 ドキュメントの body タグ内。そのため、画像と周囲の画像の間には、各辺 4px のギャップがあります。私の写真を見てください: