Loading [MathJax]/jax/element/mml/optable/SuppMathOperators.js

21 votos

Determinar si un círculo está cubierto por algún conjunto de otros círculos

Supongamos que tienes un conjunto de círculos C={C1,,Cn} cada uno con un radio fijo r pero con coordenadas de centro variables. Luego, se te da un nuevo círculo Cn+1 con el mismo radio r que los círculos anteriores pero con una nueva coordenada de centro.

¿Cómo puedes determinar si el área cubierta por Cn+1 está completamente cubierta por C?

¿Cómo hacer esto si los círculos pueden tener radios variables?

Nota: Todavía no he podido encontrar una solución matemática elegante para esto. Viniendo de la informática, lo mejor que se me ocurrió es resolver esto de una manera brutal y fea usando algún tipo de muestreo de Monte Carlo, es decir, dibujar una gran cantidad de puntos aleatorios del área de Cn+1 y luego verificar para cada punto si está incluido por lo menos en un círculo en Cintersecante (subconjunto de C con círculos que están dentro de 2r de Cn+1).

8 votos

La pregunta es difícil, aunque no sé si existe una solución. Creo que pertenece aquí.

3 votos

A primera vista, estoy de acuerdo con la lectura/evaluación de Brendan. El problema es fácil de plantear, pero no creo que eso lo excluya de ser considerado en MO. Voto en contra de cerrarlo.

1 votos

2voto

zkent Puntos 133

Creo que el trabajo de Herbert Edelsbrunner sobre las alpha shapes podría tener cierta relevancia, aunque cuando lo estaba leyendo estaba principalmente interesado en aplicaciones para determinar volúmenes y áreas de superficie, por lo que no estoy seguro si la pregunta precisa que estás haciendo está abordada. Consulta los papers aquí en su sitio web, quizás comenzando con el paper: H. Edelsbrunner. The union of balls and its dual shape. Discrete Comput. Geom. 13 (1995), 415-440.

El resumen de ese paper:

Se describen algoritmos eficientes para calcular propiedades topológicas, combinatorias y métricas de la unión de finitas bolas esféricas en Rd. Estos algoritmos se basan en un complejo simplicial dual a una descomposición de la unión de bolas usando celdas de Voronoi, y en fórmulas de inclusión-exclusión cortas derivadas de este complejo. Los algoritmos son más relevantes en R3 donde las uniones de finitas bolas son comúnmente utilizadas como modelos de moléculas.

Creo que la idea principal es básicamente la sugerida por Anton Petrunin.

1voto

anjanb Puntos 5579

Su pregunta parece equivalente a construir un "diagrama de Voronoi ponderado aditivamente" o "diagrama de Apolonio". Puede buscar en Google cualquiera de los dos, pero el artículo fundamental es el de Franz Aurenhammer (Diagramas de Voronoi - Una encuesta de una estructura de datos geométricos fundamentales es un buen lugar para buscar). La cosa se puede construir en tiempo polinomial, y las búsquedas deberían ser logarítmicas (aunque no estoy 100% seguro).

1voto

Guillermo Puntos 27

Aquí hay una solución matemática "bastante básica" a tu problema, que funciona en tiempo n3, pero programarlo es bastante fácil, es cuestión de 1 hora.

Al principio desechamos cualquier Ci (1in) que no se intersecte con $C_{n+1}.

También descartamos cualquier Ci (1in) que esté dentro de otro Cj (1jn).

Desde ahora consideramos "sombras lunares" Li=Cn+1Ci, donde 1in. Algunas Li pueden seguir siendo iguales a Ci completo, por supuesto.

El problema inicial es entonces equivalente a lo siguiente: ¿es Cn+1 igual a la unión U=i=1,,nLi?

Lo reformularemos de esta manera: ¿es el borde U igual al círculo de borde Cn+1? Para verificar esto hacemos lo siguiente:

Verificación 0) Verificamos el borde exterior Cn+1. Para hacer eso, encontramos todos los puntos pj que Ci (1jn) corta en Cn+1. Luego ordenamos todos estos puntos por su coordenada angular en Cn+1, obteniendo puntos ordenados tj (j=1,,K). Y luego para cada j=1,...,K verificamos el punto medio del segmento [t_j,t_{j+1}] -- si pertenece a algún círculo C_i con 1\leq i\leq n. Por supuesto, también verificamos el punto medio de [t_K,t_1]$. Si algún punto medio falla, entonces hemos terminado, y este punto no está cubierto.

Si no, continuamos y verificamos si \partial U no contiene puntos dentro de $C_{n+1}. Hacemos eso con:

Verificaciones 1...n) Son exactamente similares a la Verificación 0, pero consideramos el arco A_j de C_j que está dentro de C_{n+1} como el segmento de verificación. Así que nuevamente encontramos los puntos que C_i secciona en C_j dentro de A_j, incluyendo además los extremos de A_i. Luego ordenamos estos puntos hasta la coordenada angular de C_j y verificamos los puntos medios -- si cada uno está cubierto por algún círculo. Si una de estas verificaciones falla, encontramos puntos no cubiertos. Si todas las verificaciones tienen éxito, entonces C_{n+1} está cubierto.

P.D. Usando el sencillo algoritmo n \log n para calcular la unión de segmentos en el borde de un círculo, se puede reducir la complejidad a n^2 \log n.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X