Пуассона-диска выборки распределение позволит выбрать случайные точки минимальное расстояние друг от друга и алгоритм Bridson в может эффективно решить эту проблему в O (N) - достаточно быстро , в режиме реального времени , если Ваш счетчик звезда не слишком велик.
Алгоритм Бридсона делит выходную область на сетку ячеек, размер которых соответствует минимально допустимому расстоянию, так что в каждой ячейке может появиться только одна точка. Затем, когда вы рассматриваете возможность добавления новой точки, вам нужно только проверить набор соседних ячеек в форме диска, а не весь список точек. Например, рассмотрим следующее изображение:
При проверке, чтобы увидеть, находится ли синяя точка кандидата слишком близко к существующим точкам, вам не нужно проверять ее по каждой существующей точке. Вместо этого вы можете ограничить поиск точками в соседних ячейках (которые вы можете быстро найти с помощью таблицы поиска). Майк Босток имеет приятную анимацию, показывающую алгоритм в процессе.
Стандартная реализация касается только фиксированного минимального расстояния между точками. В статье « Выборка диска Пуассона» Германа Таллекена (включая исходный код) рассматривается адаптация к изменению минимального расстояния в разных частях изображения; в основном, как алгоритм дизеринга . Использование перлин-шума / симплекс-шума, как показано в статье, может дать более естественную карту звезд. Например, я использовал изображение слева для генерации справа:
Для этого при рассмотрении точки кандидата я сначала проверяю значение входного изображения, которое дает значение от 0 до 1. Затем я масштабирую его до желаемого минимального и максимального расстояния между точками; в этом случае я выбрал 5 и 20 пикселей. Таким образом, при размещении точки в темных областях мои звезды могут располагаться на расстоянии до 5 пикселей друг от друга, а при размещении звезд в светлых областях они могут находиться на расстоянии до 20 пикселей.
Стоит отметить, что ускорение Bridson не совсем работает с выборкой с переменным расстоянием, потому что выходные точки не используют одинаковое минимальное расстояние. Однако вы все равно можете использовать выходную сетку, чтобы уменьшить поиск. Меньшая сетка приводит к более быстрому поиску ближайших соседей за счет увеличения памяти для большей справочной таблицы.