Una distribución de muestreo de Poisson-Disk le permitirá seleccionar puntos aleatorios a una distancia mínima y el algoritmo de Bridson puede resolver el problema de manera eficiente en O (n), lo suficientemente rápido en tiempo real siempre que su recuento de estrellas no sea demasiado grande.
El algoritmo de Bridson divide la región de salida en una cuadrícula de celdas con un tamaño relativo a la distancia mínima permitida, de modo que solo puede aparecer un punto en cada celda. Luego, cuando considere agregar un nuevo punto, solo necesita verificar una colección en forma de disco de celdas vecinas en lugar de toda la lista de puntos. Por ejemplo, considere la siguiente imagen:
Al verificar para ver si el punto azul candidato está demasiado cerca de los puntos existentes, no necesita verificarlo con cada punto existente. En cambio, puede restringir la búsqueda a los puntos en las celdas vecinas (que puede encontrar rápidamente usando una tabla de búsqueda). Mike Bostock tiene una bonita animación que muestra el algoritmo en progreso.
La implementación estándar solo se refiere a una distancia mínima fija entre puntos. El artículo de muestreo Poisson Disk de Herman Tulleken (incluye código fuente) cubre una adaptación para variar la distancia mínima en diferentes partes de la imagen; básicamente como un algoritmo de tramado . El uso del ruido perlin / ruido simplex como se muestra en el artículo nubes podría dar un mapa estelar más natural. Por ejemplo, usé la imagen de la izquierda para generar la derecha:
Para hacer esto, cuando considero un punto candidato, primero verifico el valor de la imagen de entrada, que produce un valor de 0 a 1. Luego escalo esto a mi distancia mínima y máxima deseada entre puntos; en este caso seleccioné 5 y 20 píxeles. Entonces, cuando coloco un punto en las regiones oscuras, mis estrellas pueden estar tan cerca como 5 píxeles entre sí y cuando coloco estrellas en las regiones claras, pueden tener una separación de hasta 20 píxeles.
Vale la pena señalar que la aceleración de Bridson no funciona exactamente con muestreo de distancia variable porque los puntos de salida no están utilizando una distancia mínima uniforme. Sin embargo, aún puede utilizar una cuadrícula de salida para reducir la búsqueda. Una cuadrícula más pequeña resulta en una búsqueda más rápida de vecinos más cercanos a expensas de una mayor memoria para una tabla de búsqueda más grande.