2012-01-06 8 views
37

Ci sono alcune domande simili su StackOverflow, ma nessuna di queste sembra fornire una risposta tangibile che possa comprendere una persona senza una solida conoscenza dei problemi e degli algoritmi NP-hard.Come si ottiene l'imballaggio bidimensionale 2D a livello di programmazione?

Come si esegue il riempimento bidimensionale di oggetti rettangolari? Nel mio caso, sto cercando di assemblare più immagini in una singola immagine, da usare come sprite, usando la minima quantità di spazio. Ogni immagine ha probabilmente limiti molto diversi, ma non ci sono limiti per il contenitore.

Speravo che qualcuno con una comprensione degli algoritmi di impaccamento bin potesse spiegare come questo possa essere raggiunto a livello di programmazione, piuttosto che fornire una panoramica generale del metodo di imballaggio del contenitore.

+1

http://www.codeproject.com/KB/web-image/rectanglepacker.aspx –

+1

In realtà ho letto quell'articolo in modo abbastanza approfondito e, mentre ha migliorato la mia comprensione del bin packing, la sua implementazione di esempio si basa molto sui costrutti disponibile in C#. Anche dopo aver letto il codice sorgente fornito, non ho idea di come compie alcuni dei passaggi necessari. – FrozenFire

risposta

20

I Googled "bin packing code" e questo è stato il mio primo successo: http://codeincomplete.com/posts/2011/5/7/bin_packing/

Ecco un riassunto: costruire un albero binario. Ogni ramo nell'albero contiene uno sprite. Ogni nodo foglia rappresenta lo spazio disponibile. Inizialmente l'albero ha solo il nodo radice, che rappresenta tutto lo spazio disponibile. Per aggiungere uno sprite all'albero, cerca nell'albero un nodo non occupato (foglia) abbastanza grande da contenere lo sprite. Trasforma quel nodo da una foglia in un ramo impostando lo sprite come occupante del nodo e dando al nodo due figli. Un bambino rappresenta lo spazio rimanente a destra dello sprite; l'altro rappresenta lo spazio rimanente sotto lo sprite e il primo figlio.

L'articolo che ho collegato sopra lo spiega molto più pienamente, con diagrammi e codice JavaScript. Spiega anche come far crescere dinamicamente il foglio sprite piuttosto che scegliere una dimensione fissa in anticipo.