Интересная проблема!
Я сделал то же самое с неправильными полигонами (в этом случае здания были упакованы так, чтобы не перекрываться)
Используются postgresql и postgis, и python. Грубый алгоритм был
- Найти случайную точку в ограничительной рамке многоугольника (ST_Envelope)
- Если точка за пределами многоугольника, вернитесь на один шаг назад
- Сделать геометрию для дерева по центру этой случайной точки
- Если это перекрывает любое существующее размещенное дерево (ST_Overlaps), вернитесь к началу
- Добавить дерево в точке
- Возвращайтесь, чтобы начать
Я не могу гарантировать, что это даст глобальный оптимум, для этого вам понадобится алгоритм «круговой упаковки» (как уже упоминали другие).
Это будет продолжаться вечно, поэтому вам нужно будет добавить код, чтобы решить, когда выйти, например
- когда объединенная площадь размещенных деревьев составляет определенный процент от площади многоугольника
- когда требуется более N итераций, чтобы найти неперекрывающееся дерево.
Согласно Circle Packing в Википедии, наилучшая плотность упаковки достигается с помощью шестиугольной сетки. Может быть возможно создать такую сетку, используя MMQGIS, чей интервал зависит от размера ваших деревьев, которые, как я полагаю, идентичны. Затем поместите дерево в каждую вершину. Но тогда у вас есть проблема, чтобы узнать, где разместить сетку, чтобы максимизировать количество деревьев.