Une distribution d' échantillonnage Poisson-Disk vous permettra de sélectionner des points aléatoires à une distance minimale l'un de l'autre et l'algorithme de Bridson peut résoudre efficacement le problème en O (n) - assez rapidement pour le temps réel à condition que votre nombre d'étoiles ne devienne pas trop énorme.
L'algorithme de Bridson divise la région de sortie en une grille de cellules dimensionnée par rapport à la distance minimale autorisée, de sorte qu'un seul point peut apparaître dans chaque cellule. Ensuite, lorsque vous envisagez d'ajouter un nouveau point, il vous suffit de vérifier une collection en forme de disque de cellules voisines par opposition à la liste entière de points. Par exemple, considérez l'image suivante:
Lors de la vérification pour voir si le point bleu candidat est trop proche des points existants, vous n'avez pas besoin de le comparer à chaque point existant. Au lieu de cela, vous pouvez limiter la recherche aux points dans les cellules voisines (que vous pouvez trouver rapidement en utilisant une table de recherche). Mike Bostock a une belle animation montrant l'algorithme en cours.
L'implémentation standard ne concerne qu'une distance minimale fixe entre les points. L' article d'échantillonnage du disque de Poisson d' Herman Tulleken (inclut le code source) couvre une adaptation pour faire varier la distance minimale à différentes parties de l'image; essentiellement comme un algorithme de tramage . L'utilisation du bruit perlin / bruit simplex comme indiqué dans l'article peut donner une carte des étoiles plus naturelle. Par exemple, j'ai utilisé l'image de gauche pour générer la droite:
Pour ce faire, lorsque je considère un point candidat, je vérifie d'abord la valeur de l'image d'entrée, qui donne une valeur de 0 à 1. Je l'échelle ensuite à ma distance min & max souhaitée entre les points; dans ce cas, j'ai sélectionné 5 et 20 pixels. Ainsi, lorsque vous placez un point dans les régions sombres, mes étoiles peuvent être aussi proches que 5 pixels les unes des autres et lorsque vous placez des étoiles dans les régions claires, elles peuvent être éloignées jusqu'à 20 pixels.
Il convient de noter que l'accélération de Bridson ne fonctionne pas exactement avec l'échantillonnage à distance variable car les points de sortie n'utilisent pas une distance minimale uniforme. Cependant, vous pouvez toujours utiliser la grille de sortie pour réduire la recherche. Une grille plus petite entraîne une recherche plus rapide des voisins les plus proches au détriment d'une mémoire accrue pour une table de recherche plus grande.