Cobertura de rectángulo por línea de barrido

9

Me dan un ejercicio que desafortunadamente no tuve éxito por mí mismo.

Hay un conjunto de rectángulos y un rectángulo . Usando el algoritmo de barrido plano, determine si está completamente cubierto por el conjunto de .R1..RnR0R0R1..Rn

Para obtener más detalles sobre el principio de los algoritmos de línea de barrido, consulte aquí .

Vamos a empezar desde el principio. Inicialmente, conocemos el algoritmo de línea de barrido como el algoritmo para encontrar intersecciones de segmento de línea que requiere dos estructuras de datos:

  • un conjunto de puntos de evento (almacena puntos finales de segmentos y puntos de intersección)Q
  • un estado (estructura dinámica para el conjunto de segmentos que cruzan la línea de barrido)T

La idea general: suponga que la línea de barrido es una línea vertical que comienza a acercarse al conjunto de rectángulos desde la izquierda. Ordene todas las coordenadas de los rectángulos y guárdelas en en orden creciente; debe tomar . Comience desde el primer punto de evento, para cada punto determine el conjunto de rectángulos que se cruzan en la coordenada dada , identifique segmentos continuos de rectángulos de intersección y verifique si cubren completamente en la coordenada actual . Con como árbol binario, tomará . Si alguna parte de permanece descubierta,lxQO(nlogn)xR0xTO(logn)R0R0 no está completamente cubierto.

Detalles: La idea del algoritmo de intersección de segmentos era que solo los segmentos adyacentes se cruzan. En base a este hecho, creamos el estado y lo mantuvimos en todo el algoritmo. Traté de encontrar una idea similar en este caso y hasta ahora sin éxito, lo único que puedo decir es que dos rectángulos se cruzan si sus correspondientes coordenadas e superponen.Txy

El problema es cómo construir y mantener , y lo que la complejidad de construir y mantener es. Supongo que los árboles R pueden ser muy útiles en este caso, pero como encontré es muy difícil determinar el rectángulo límite mínimo usando árboles R.TT

¿Tienes alguna idea sobre cómo resolver este problema, y ​​particularmente cómo construir ?T

com
fuente
1
¿Son estos rectángulos alineados a los ejes o no? (Puede hacerlo de cualquier manera, pero es más fácil si lo son.)
Louis
@Louis, simplifiquemos un poco, supongamos que hay rectángulos alineados a los ejes, pero, por supuesto, el caso general es más interesante
com
¿Qué puntos de un rectángulo son puntos de evento? Todas las esquinas, la superior izquierda ...
Raphael
@Raphael, solo las X son puntos de evento
com

Respuestas:

6

Comencemos con rectángulos alineados a los ejes, ya que hay una especie de argumento directo fácil. Barreremos una línea vertical. Los eventos son los puntos finales de los bordes horizontales de los rectángulos. A medida que barremos, mantenemos un conjunto de intervalos en la línea de barrido que están "descubiertos" por , :nRii1

  • Agregue el intervalo vertical cubierto por el rectángulo a la línea de barrido cuando encontremos por primera vezRiRi
  • Elimine el intervalo vertical cubierto por el rectángulo de la línea de barrido cuando paseRiRi

Es fácil hacer esto con un árbol binario para que las actualizaciones tomen tiempo . (El problema es, esencialmente, unidimensional. Usted descubre si los puntos finales están en un intervalo descubierto y los extiende / fusiona adecuadamente al agregarlos y los alarga al eliminarlos).O(logn)

Luego simplemente verifica que, en el lapso de , ninguno de los intervalos descubiertos se cruza con el tramo vertical de . Todo el asunto es tiempo un espacio .R0R0O(nlogn)O(n)

Para el caso general, el truco obvio no es tan rápido. Use el algoritmo de línea de barrido estándar para calcular la subdivisión plana completa inducida por los rectángulos.

Claramente, un conjunto de discos de las caras cubre . Por sí solo, esto no nos dice lo suficiente, ya que lo que nos interesa es si alguna de estas caras está dentro de y fuera de los otros rectángulos. Para hacer esto, modificamos un poco la construcción, de modo que cuando agregamos un borde, etiquetamos un lado con la identidad del rectángulo que está dentro. Esto agrega sobrecarga, por lo que la construcción es tiempo; sin suposiciones en los rectángulos, la salida puede ser de tamaño , por lo que estamos usando ese espacio en el peor de los casos, por lo que el tiempo es "existencialmente óptimo" aunque no "sensible a la salida".FR0R0O(1)O(n2logn)Ω(n2)

Finalmente, está cubierto siempre que ninguna de las caras en tenga solo bordes no etiquetados como si estuvieran en uno de los . El punto es que si un borde de está en , entonces la totalidad de está. Imagine barrer una línea sobre ortogonalmente a lo largo de este borde: solo puede dejar fuera de o está delimitado por más de un borde de .F R i f R i f f R i f f R iR0FRifRiffRiffRi

Entonces, la conclusión es que el caso especial es y el general es al menos, pero sospecho que se puede mejorar.O ( n 2 log n )O(nlogn)O(n2logn)

Louis
fuente
Muchas gracias por su respuesta. Hay algunas cosas que quiero dejar en claro sobre el caso general. : los puntos de evento son coordenadas ordenadas, - estado - intervalos "descubiertos", como entendí que es el intervalo correspondiente a de una de las 's que está descubierta por cualquier otra . La parte con no entendí. Creo que en cada iteración (sumando) deberíamos verificar si el intervalo se cruza con , ¿es correcto? x T x i R R i , i 1 R 0 R 0QxTxiRRi,i1R0R0
com
Para el caso general, básicamente estoy asumiendo que sabes cómo construir todo el mapa plano inducido por los rectángulos, y luego estoy argumentando que una cara de esto está completamente en si uno de sus bordes delimitadores está en el "interior" de . Puede realizar un seguimiento de esto en los algoritmos de barrido habituales (p. Ej., Del libro "Marcas") simplemente registrando las direcciones "interior" y "exterior" de los segmentos cuando se agregan a la línea de barrido. R iRiRi
Louis