Hmm, problema muy interesante. Mi enfoque probablemente sería algo similar a lo siguiente:
- Encuentre una forma de averiguar cuáles son las áreas de intersección entre un número arbitrario de círculos, es decir, si tengo 3 círculos, necesito poder determinar cuál es la intersección entre esos círculos. El método "Monte-Carlo" sería una buena forma de aproximar esto ( http://local.wasp.uwa.edu.au/~pbourke/geometry/circlearea/ ).
- Elimine cualquier círculo que esté contenido por completo en otro círculo más grande (mire el radio y el módulo de la distancia entre el centro de los dos círculos). No creo que sea obligatorio.
- Elija 2 círculos (llámelos A y B) y calcule el área total usando esta fórmula:
(esto es cierto para cualquier forma, ya sea circular o no)
area(A∪B) = area(A) + area(B) - area(A∩B)
Donde A ∪ B
significa A unión B y A ∩ B
significa A intersección B (puede resolver esto desde el primer paso.
- Ahora continúe agregando círculos y continúe calculando el área agregada como una suma / resta de áreas de círculos y áreas de intersecciones entre círculos. Por ejemplo, para 3 círculos (llame al círculo adicional C) calculamos el área usando esta fórmula:
(Esto es lo mismo que arriba donde A
se ha reemplazado por A∪B
)
area((A∪B)∪C) = area(A∪B) + area(C) - area((A∪B)∩C)
Donde area(A∪B)
acabamos de hacer ejercicio y area((A∪B)∩C)
se puede encontrar:
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)
Donde nuevamente puedes encontrar el área (A∩B∩C) desde arriba.
Lo complicado es el último paso: cuantos más círculos se agregan, más complejo se vuelve. Creo que hay una expansión para resolver el área de una intersección con una unión finita, o, alternativamente, es posible que pueda resolverlo de forma recursiva.
También con respecto al uso de Monte-Carlo para aproximar el área de la sección, creo que es posible reducir la intersección de un número arbitrario de círculos a la intersección de 4 de esos círculos, que se pueden calcular exactamente (no tengo idea de cómo hacer esto sin embargo).
Probablemente haya una mejor manera de hacer esto por cierto: la complejidad aumenta significativamente (posiblemente exponencialmente, pero no estoy seguro) por cada círculo adicional agregado.