В общем, в произвольном пространстве с произвольной функцией плотности вы можете получить разумное приближение с помощью выборки отклонения .
- Найдите свою максимальную плотность
D
.
- Выберите случайную точку
p
.
- Выберите случайное число
r
из диапазона [0,D)
.
- Если плотность на
p
больше r
, примите p
в качестве одной из ваших точек.
Я не уверен, насколько легко это будет применяться к вашему делу. Создание случайных, равномерно распределенных точек по сетке само по себе кажется сложной задачей. Единственное решение, которое я могу придумать, - это вычислить площадь каждого треугольника в вашей сетке, случайным образом выбрать треугольник с вероятностью, пропорциональной его площади, и выбрать случайную точку внутри треугольника. Я полагаю, что вы могли бы сделать этот выбор в O (logN) на N треугольников.
Но, учитывая, что вы, возможно, отбрасываете большинство этих точек, это может оказаться гораздо хуже, чем ваш нынешний подход, учитывая достаточно большую сетку и достаточно неприятную функцию плотности (то есть такую, у которой максимум намного больше среднего) .
Как и при любой случайной выборке, требуется немало точек, прежде чем она начнет напоминать базовое распределение; небольшой набор точек, вероятно, будет выглядеть более или менее случайным. Но вы можете обойти это с помощью некоторого квазислучайного метода размещения точек (и даже с большим набором, это может дать лучшие результаты).
Одна вещь, которая приходит на ум, - это гибрид вышеуказанного подхода и алгоритма @ BlackBear. Вы можете рассчитать площадь и среднюю плотность для каждого треугольника, и использовать это, чтобы решить, сколько точек должен содержать каждый. Затем для фактического размещения точек в треугольнике используйте метод выборки отклонения.