Hmm, problema muito interessante. Minha abordagem provavelmente seria algo como o seguinte:
- Encontre uma maneira de descobrir quais são as áreas de interseção entre um número arbitrário de círculos, ou seja, se eu tiver 3 círculos, preciso ser capaz de descobrir qual é a interseção entre esses círculos. O método "Monte-Carlo" seria uma boa maneira de aproximar isso ( http://local.wasp.uwa.edu.au/~pbourke/geometry/circlearea/ ).
- Elimine quaisquer círculos que estejam contidos inteiramente em outro círculo maior (observe o raio e o módulo da distância entre o centro dos dois círculos) que não acho que seja obrigatório.
- Escolha 2 círculos (chame-os de A e B) e calcule a área total usando esta fórmula:
(isso é verdadeiro para qualquer forma, seja círculo ou outro)
area(A∪B) = area(A) + area(B) - area(A∩B)
Onde A ∪ B
significa A união B e A ∩ B
significa A intersecção B (você pode resolver isso desde a primeira etapa.
- Agora continue adicionando círculos e continue trabalhando a área adicionada como uma soma / subtração de áreas de círculos e áreas de interseção entre círculos. Por exemplo, para 3 círculos (chame o círculo extra C), calculamos a área usando esta fórmula:
(Este é o mesmo que acima, onde A
foi substituído por A∪B
)
area((A∪B)∪C) = area(A∪B) + area(C) - area((A∪B)∩C)
Onde area(A∪B)
acabamos de trabalhar e area((A∪B)∩C)
pode ser encontrado:
area((A∪B)nC) = area((A∩C)∪(B∩C)) = area(A∩C) + area(A∩B) - area((A∩C)∩(B∩C)) = area(A∩C) + area(A∩B) - area(A∩B∩C)
Onde novamente você pode encontrar a área (A∩B∩C) de cima.
A parte complicada é a última etapa - quanto mais círculos são adicionados, mais complexo ele se torna. Acredito que haja uma expansão para calcular a área de uma interseção com uma união finita ou, alternativamente, você pode resolvê-la recursivamente.
Ainda com relação ao uso de Monte-Carlo para aproximar a área de itersecção, acredito que seja possível reduzir a intersecção de um número arbitrário de círculos para a intersecção de 4 desses círculos, que pode ser calculado exatamente (não tenho ideia de como fazer isso Contudo).
Provavelmente há uma maneira melhor de fazer isso aliás - a complexidade aumenta significativamente (possivelmente exponencialmente, mas não tenho certeza) para cada círculo extra adicionado.