То, что вы ищете, называется распределением Пуассона-диска . Это происходит в природе при распределении фоторецепторных клеток на сетчатке. Майк Босток ( Профиль StackOverflow ) написал замечательную статью под названием Алгоритмы визуализации . У него есть демонстрационные примеры JavaScript и много кода для просмотра.
В интересах сделать больше, чем добавить ссылку в ответ, я постараюсь дать краткое изложение статьи:
Алгоритм лучшего кандидата Митчелла
Простое приближение, известное как алгоритм лучшего кандидата Митчелла. Легко реализовать обе толпы в одних пространствах и оставить пробелы в других. Алгоритм добавляет новые точки по одному. Для каждой новой выборки алгоритм наилучшего кандидата генерирует фиксированное число кандидатов, скажем, 10. Точка, наиболее удаленная от любой другой точки, добавляется в набор, и процесс повторяется до тех пор, пока не будет достигнута желаемая плотность.
Алгоритм Бридсона
Алгоритм Бридсона для выборки с диска Пуассона ( оригинальная статья pdf) масштабируется линейно и также прост в реализации. Этот алгоритм растет с начальной точки и (ИМХО) довольно интересно наблюдать (снова см. Статью Майка Бостока). Все точки в наборе либо активны, либо неактивны. все точки добавляются как активные. Одна точка выбирается из активного набора, и в кольце (a.k.a кольцо) генерируется некоторое количество точек-кандидатов, которое проходит от образца с внутренним кругом, имеющим радиус r
, и внешним кругом, имеющим радиус 2r
. Выборка кандидата менее чем на расстоянии r от любой точки в FinalSet отклоняется. Как только образец найден, который не отклонен, он добавляется в FinalSet. Если все образцы-кандидаты отклонены, исходная точка помечается как неактивная, если предположить, что она имеет столько соседних точек, что больше не может быть добавлена вокруг нее. Когда все выборки неактивны, алгоритм завершается.
Сетка размером r/√2
может быть использована для значительного увеличения скорости проверки баллов-кандидатов. Только одна точка может быть в квадрате сетки, и нужно проверять только ограниченное число соседних квадратов.