Una distribuzione di campionamento di Poisson-Disk ti permetterà di selezionare punti casuali a una distanza minima e l'algoritmo di Bridson può risolvere efficacemente il problema in O (n) - abbastanza veloce per il tempo reale a condizione che il conteggio delle stelle non diventi troppo grande.
L'algoritmo di Bridson divide la regione di output in una griglia di celle dimensionata rispetto alla distanza minima consentita, in modo tale che in ciascuna cella possa apparire solo un punto. Quindi, quando si considera l'aggiunta di un nuovo punto, è necessario solo controllare una raccolta di celle vicine a forma di disco anziché l'intero elenco di punti. Ad esempio, considera la seguente immagine:
Quando si verifica se il punto blu candidato è troppo vicino ai punti esistenti, non è necessario verificarlo con tutti i punti esistenti. Invece puoi limitare la ricerca ai punti nelle celle vicine (che puoi trovare rapidamente usando una tabella di ricerca). Mike Bostock ha una bella animazione che mostra l'algoritmo in corso.
L'implementazione standard riguarda solo una distanza minima fissa tra i punti. L' articolo di campionamento del disco di Poisson di Herman Tulleken (include il codice sorgente) copre un adattamento per variare la distanza minima in diverse parti dell'immagine; fondamentalmente come un algoritmo di dithering . L'uso del rumore perlin / del rumore simplex come mostrato nelle nuvole dell'articolo potrebbe dare una mappa stellare dall'aspetto più naturale. Ad esempio, ho usato l'immagine a sinistra per generare la destra:
Per fare ciò, quando si considera un punto candidato, per prima cosa controllo il valore dell'immagine di input, che produce un valore da 0 a 1. Quindi lo ridimensiono alla distanza minima e massima desiderata tra i punti; in questo caso ho selezionato 5 e 20 pixel. Quindi quando posiziono un punto nelle regioni scure, le mie stelle possono essere vicine quanto 5 pixel l'una all'altra e quando posizionano le stelle nelle regioni chiare, possono essere distanti fino a 20 pixel.
Vale la pena notare che l'accelerazione di Bridson non funziona esattamente con il campionamento a distanza variabile perché i punti di uscita non utilizzano una distanza minima uniforme. Tuttavia, è ancora possibile utilizzare una griglia di output per ridurre la ricerca. Più piccola è la griglia, più rapida sarà la ricerca dei vicini più vicini a scapito di una maggiore memoria per una tabella di ricerca più ampia.