Problema interessante!
Fiz uma coisa semelhante com polígonos irregulares (neste caso, os edifícios estavam lotados para não se sobrepor)
Utilizou postgresql e postgis, e python. O algoritmo aproximado foi
- Localizar ponto aleatório na caixa delimitadora do polígono (ST_Envelope)
- Se apontar para fora do polígono, volte um passo
- Faça uma geometria para a árvore centralizada neste ponto aleatório
- Se isso se sobrepuser a qualquer árvore colocada existente (ST_Overlaps), volte para iniciar
- Adicionar árvore no ponto
- Voltar ao início
Não posso garantir que isso ofereça o melhor global, você precisaria de um algoritmo de 'empacotamento circular' para isso (como outros já mencionaram).
Isso continuará para sempre, portanto, você precisará inserir algum código para decidir quando sair, por exemplo,
- quando a área combinada de árvores colocadas é uma certa porcentagem da área do polígono
- quando são necessárias mais de N iterações para encontrar uma árvore não sobreposta.
De acordo com a Circle Packing na Wikipedia, a melhor densidade de empacotamento é obtida com uma grade hexagonal. Pode ser possível criar uma grade usando o MMQGIS, cujo espaçamento é baseado no tamanho das suas árvores, que eu assumo serem idênticas. Em seguida, coloque uma árvore em cada vértice. Mas então, você tem o problema de saber onde posicionar a grade para maximizar o número de árvores.