2011-05-21 30 views
8

Estoy buscando/tratando de desarrollar un algoritmo óptimo para rectilinear polygon intersección con rectángulos. Los polígonos que estoy probando no tienen agujeros.intersección de polígono rectilíneo

Las respuestas como las dadas here y here son para polígonos muy generales, y las soluciones son comprensiblemente bastante complejas.

Esperando que la comunidad S.O. me ayude a documentar algoritmos para casos especiales con solo polígonos rectilíneos.

Busco el polígono relleno en verde en la imagen de abajo:

rectilinear polygon intersection with a rectangle

+0

son los bordes del polígono rectilíneo y los rectángulos paralelos a los ejes? –

+0

@Andre - sí - todas las líneas son paralelas – jedierikb

+0

Como primer pensamiento, almacenar el polígono rectilíneo en un [árbol de segmentos] (http://en.wikipedia.org/wiki/Segment_tree) (para dos dimensiones) viene a mi mente. Suponiendo que los polígonos rectilíneos son los que no cambian y los rectángulos varían. –

Respuesta

2

El libro Geometría Computacional: una Introducción por Preparata y Shamos tiene un capítulo sobre polígonos rectilíneas.

+1

Gracias. Voy a ver los capítulos 2 y 8. Veo que el término que quiero son polígonos isotéticos. – jedierikb

1

Utilice un algoritmo de línea de barrido, haciendo uso del hecho de que un polígono rectilíneo se define por sus vértices.

Representa los vértices junto con el rectángulo al que pertenecen, es decir, algo así como (x, y, #rect). A este conjunto de puntos, agregue los puntos que resultan de las intersecciones de todos los bordes. Estos nuevos puntos tienen el formato (x, y, final), ya que sabemos que pertenecen al conjunto de puntos resultante.

Ahora:

  • tipo todos los puntos de su valor de x
  • utilizar una línea de barrido, a partir de los primeros coordenada x; para cada punto nuevo:
    • si es un "punto de inicio", agréguelo a un conjunto temporal T. Marcarlo como "final" si se trata de un punto del rectángulo A y entre coordenadas y de puntos del rectángulo B en T (o viceversa).
    • si es un "punto final", y eliminar y su correspondiente punto de inicio de T.

Después de eso, todos los puntos que están marcados "final" denotan los vértices del polígono resultante.

Sea N el número total de puntos. Suponiendo además que probar si debemos marcar un punto como "final" toma tiempo O (log (n)) buscando T, todo este algoritmo está en O (N * log (N)).

Tenga en cuenta que la tarea de encontrar todas las intersecciones se puede incorporar al algoritmo anterior, ya que encontrar todas las intersecciones de manera eficiente es en sí mismo un algoritmo de línea de barrido. También tenga en cuenta que el conjunto resultante de puntos puede contener más de un polígono, lo que hace que sea un poco más difícil reconstruir los polígonos de solución fuera de los vértices "finales".