Newsgroup: it.scienza.informatica
Titolo: Raggruppare punti in mappa di densità

Salve a tutti,
mi trovo ad avere da rappresentare dei punti su un piano cercando di
dare enfasi alle zone più popolate.
In particolare se li rappresento semplicemente su un piano mi trovo
che se ho 50 punti nelle stesse coordinate non riesco a distinguerle
da un singolo punto...
Mi piacerebbe "raggrupparli" in una specie di bolle di dimensione
proporzionale alla densità locale.
Suggerimenti su algoritmi da applicare?
grazie mille!

apaella ha scritto:
 > mi trovo ad avere da rappresentare dei punti su un piano cercando di
 > dare enfasi alle zone più popolate.
 > In particolare se li rappresento semplicemente su un piano mi trovo
 > che se ho 50 punti nelle stesse coordinate non riesco a distinguerle
 > da un singolo punto...
 >
 > Mi piacerebbe "raggrupparli" in una specie di bolle di dimensione
 > proporzionale alla densità locale.
Ho gia' risposto due giorni fa a questo messaggio, ma non vedo comparire 
la mia risposta, quindi la ripeto.
Ecco un algoritmo efficace ma inefficiente. A te ottimizzarlo.
L'immagine che otterrai sara' una bitmap grafica, e quindi utilizza una 
bitmap propriamente detta, cioe' un array bidimensionale di variabili 
booleane, avente come dimensioni la larghezza e l'altezza in pixel 
dell'immagine che vuoi ottenere.
Inizialmente, tutti i bit sono falsi.
Per ogni punto, determina quale e', tra tutti i bit falsi, quello piu' 
vicino alle coordinate vere del punto. Imposta a vero tale bit.
Alla fine, crea una bitmap grafica usando il tuo array bidimensionale di 
bit.
Oltre alla lentezza, tale algoritmo potrebbe avere il difetto che 
l'immagine risultante ha troppi bit ancora falsi, o viceversa che ne ha 
troppi resi veri.
Per rimediare al primo problema basta far finta che ogni punto conti per 
N punti, con N intero.
Per rendere piu' flessibile la soluzione al primo problema e per 
risolvere il secondo problema, si puo' far finta che ogni punto conti A 
punti, con A numero a virgola mobile positivo. In tal caso, ogni cella 
non puo' piu' essere un semplice bit, ma dovrebbe essere un numero, 
diciamo a 8 bit (da 0 a 255), e l'algoritmo si complica un po'.
Analoga complicazione si ha se i punti originali non hanno tutti peso 
unitario, ma ogni punto ha un peso rappresentato da un numero a virgola 
mobile.
In tali casi l'algoritmo diventa il seguente.
Inizialmente, tutti i pixel sono a 0.
Per ogni punto, determina quale e', tra tutti i pixel aventi valore 
inferiore a 255, quello piu' vicino alle coordinate vere del punto. 
Somma il valore del punto a tale pixel. Se il risultato supera 255, 
assegna 255 a tale pixel, e ripeti l'elaborazione del punto dopo avergli 
tolto il valore appena sommato, cioe' 255 - <valore precedente del pixel>.
Alla fine, crea un'immagine grafica a toni di grigio usando il tuo array 
bidimensionale di byte.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila


Perche' non rappresenti la densita' in un punto come un valore di elevazione?
Puoi cosi' ottenere un grafico 3D (x:y:densita').
Oppure se vuoi una immagine bidimesionale puoi rappresentare la densita' con
un colore, o una sfumatura di grigio. Potresti considerare come colore Nero il
valore massimo di densita' normalizzato a 1 e sfumare via via fino alla
densita' 0 (bianco).
Cosi' l'immagine dovrebbe comunicare subito l'informazione che vuoi
rappresentare.
Ciao,
  ao.

Il problema di fondo è quello di posizionare un tot di indicatori su
una mappa di google.
Volevo fare una icona circolare proporzionale in raggio al numero di
"punti vicini".
Per come sono fatte le API di google, se i punti sono vicini o
coincidenti non riesci visivamente a vedere "quanti sono".
Grazie cmq per il suggerimento :D
