Algoritmo para calcular as posições de círculos aleatórios para que eles não se sobreponham

Eu tenho o seguinte problema.

Eu tenho uma grande região preenchida com um número aleatório de círculos de tamanhos diferentes. Se um novo círculo de raio aleatório for inserido em um local aleatório, eu gostaria de encontrar uma posição próxima para que ele não se sobreponha a nenhum dos outros. É ótimo se os círculos ficarem próximos.

O número de círculos e seu tamanho são limitados, mas aleatórios. A região será bem grande, (2500x2500, talvez), então uma matriz de pixels, como propostoAqui está fora de questão. Uma pessoa que respondeu a mesma pergunta propôs uma grade, na qual as células são do tamanho dos círculos. Isso resolveria meu problema, usando células do tamanho do maior círculo possível, mas gostaria que os círculos permanecessem o mais próximo possível, para que não satisfizesse inteiramente minhas necessidades.

Uma abordagem muito básica consiste em detectar colisões na colocação do novo círculo e afastá-lo do círculo com o qual ele colide. Depois disso, verifique as colisões novamente e repita o processo. Isso obviamente não é muito elegante e é propenso a loops infinitos (mais frequentemente do que você imagina).

O objetivo é encontrar a posição mais próxima possível do círculo recém-inserido, para que ele não se sobreponha a ninguém.

P.D.
Uma coisa muito boa, mas uma questão diferente, e não meu objetivo principal, seria reorganizar tantos círculos quantos forem necessários, em vez de realocar apenas um, como se eles estivessem "empurrando" um ao outro. Eu favoreceria a distância sobre o número de círculos movidos. Ou seja, prefiro que muitos círculos movam um pouco mais de um círculo para se afastarem muito da posição original.

questionAnswers(3)

yourAnswerToTheQuestion