2010-03-28 13 views
6

Ho una serie di N numeri positivi, e un rettangolo di dimensioni X e Y che ho bisogno di partizionare in N minore rettangoli tali che:partizione un rettangolo in vicino quadrati di determinate aree

  • la superficie di ciascun rettangolo più piccolo è proporzionale al suo numero corrispondente nel dato insieme
  • tutto lo spazio di grande rettangolo è occupata e non c'è spazio residuo tra rettangoli più piccoli
  • ogni piccolo rettangolo dovrebbe essere configurato come vicino al quadrato fattibile
  • il tempo di esecuzione deve essere ragionevolmente piccola

devo indicazioni su questo. Conoscete un tale algoritmo descritto sul web? Hai qualche idea (lo pseudo-codice va bene)?

Grazie.

risposta

8

ciò che si descrive i suoni come un treemap:

Treemap visualizzare dati gerarchici (struttura ad albero) come un insieme di rettangoli nidificati. A ogni ramo dell'albero viene assegnato un rettangolo, che viene quindi affiancato da rettangoli più piccoli che rappresentano rami secondari. Il rettangolo di un nodo foglia ha un'area proporzionale a una dimensione specificata sui dati.

che Wikipedia pagina della a page by Ben Shneiderman, che dà una bella panoramica e collegamenti a implementazioni Java:

Poi mentre sconcertante su questo nel salone facoltà, ho avuto l'Aha! esperienza nel dividere lo schermo in rettangoli alternando le direzioni orizzontali e verticali mentre attraversi i livelli. Questo algoritmo ricorsivo sembrava interessante, ma mi ci sono voluti alcuni giorni per convincermi che avrebbe funzionato sempre e per scrivere un algoritmo a sei righe.

Wikipedia anche "Squarified Treemaps" by Mark Bruls, Kees Huizing and Jarke J. van Wijk (PDF) che presenta un possibile algoritmo:

Come possiamo Tesselate un rettangolo in modo ricorsivo in rettangoli, in modo tale che le loro aspect-ratio (ad esempio max (altezza/larghezza, larghezza/altezza)) avvicinare 1 il più vicino possibile? Il numero di tutte le tessere possibili è molto grande. Questo problema rientra nella categoria dei problemi NP-hard. Tuttavia, per la nostra applicazione non abbiamo bisogno della soluzione ottimale, una buona soluzione che può essere calcolata in breve tempo è necessaria.

Non si parla di ricorsione nella domanda, quindi la situazione potrebbe essere solo un livello della mappa dei tre; ma dal momento che gli algoritmi funzionano su un livello alla volta, questo non dovrebbe essere un problema.

+0

Daremo un'occhiata più da vicino ai collegamenti che hai fornito, ma penso che non sia una mappa gerarchica, anche se hai ragione in quanto dovrebbe sembrare uno. Ho visto queste mappe ad albero diverse volte (ad esempio la misura grafica di quanto un'API è stata modificata dalla versione alla versione o rappresentazione dell'utilizzo del disco per cartella/file). Non ho nessuna gerarchia nei miei dati. Per esempio. supponiamo di voler rappresentare 100 scambi di quote di mercato nelle ultime 24 ore in cui l'area è proporzionale al volume del commercio (e il cambiamento di prezzo è rappresentato dal colore). –

+0

Da Bruls et al .: "Innanzitutto, non consideriamo la suddivisione per tutti i livelli simultaneamente, il che comporta un'esplosione nei tempi di calcolo, ma ci sforziamo di produrre rettangoli quadrati per un insieme di fratelli, dato il rettangolo in cui devono adattarsi e applicare lo stesso metodo in modo ricorsivo. " Quindi sembra che dovrebbe funzionare per te. L'esempio nella sezione 3.1 dovrebbe già darti una buona idea di come funziona; pseudocodice è nella sezione 3.2. – Thomas

1

Ho lavorato su qualcosa di simile. Sto dando la priorità alla semplicità rispetto all'ottenimento di proporzioni simili il più possibile. Questo dovrebbe (in teoria) funzionare. Testato su carta per alcuni valori di N tra 1 e 10.

N = numero totale di rettangoli per creare, Q = max (larghezza, altezza)/min (larghezza, altezza), R = N/Q

Se Q> N/2, dividere il rect in N parti lungo il lato più lungo. Se Q < = N/2, dividere il rettangolo in parti R (arrotondate int) lungo il lato più corto. Quindi dividere i sottobretti in N/R (arrotondato in basso int) lungo il lato più corto. Sottrarre il valore arrotondato dal risultato della successiva divisione subrects. Ripeti l'operazione per tutti i sottotitoli o finché non viene creato il numero richiesto di rects.