La clase de problemas de localización de puntos es un tema fundamental de la geometría computacional . Encuentra aplicaciones en áreas que se ocupan del procesamiento de datos geométricos: gráficos por computadora , sistemas de información geográfica (SIG), planificación de movimiento y diseño asistido por computadora (CAD).
En una de sus formas generales, el problema consiste en determinar, dada una partición del espacio en regiones disjuntas , la región donde se encuentra un punto de consulta. Por ejemplo, el problema de determinar qué ventana de una interfaz gráfica de usuario contiene un clic del ratón dado puede formularse como una instancia de localización de puntos, con una subdivisión formada por las partes visibles de cada ventana, aunque las estructuras de datos especializadas pueden ser más apropiadas que las estructuras de datos de localización de puntos de propósito general en esta aplicación. [ 1 ] Un caso especial es el problema del punto en el polígono , en el que se necesita determinar si un punto está dentro, fuera o en el límite de un solo polígono . Existen otros casos especiales.
El problema puede plantearse para un conjunto de regiones arbitrarias en el espacio, que no necesariamente son disjuntas y no necesariamente constituyen una partición.
Además, puede ser necesario determinar la ubicación de varios puntos con respecto a la misma partición del espacio. O bien, las particiones pueden ser cambiantes. En este último caso, la clase de problemas se superpone con los problemas de búsqueda de rangos . Para resolver de manera eficiente los problemas con consultas o regiones variables, es útil construir una estructura de datos que, dado un punto de consulta, determine rápidamente qué región contiene dicho punto (por ejemplo, el diagrama de Voronoi ).
Ubicación en una subdivisión
Caso planar

En el caso planar, se nos da una subdivisión planar S , formada por múltiples polígonos llamados caras, y necesitamos determinar qué cara contiene un punto de consulta. Es posible realizar una búsqueda exhaustiva de cada cara utilizando el algoritmo de punto en polígono , pero generalmente no es factible para subdivisiones de alta complejidad. Diversos enfoques conducen a estructuras de datos óptimas, con un espacio de almacenamiento de O ( n ) y un tiempo de consulta de O(log n ), donde n es el número total de vértices en S. Para simplificar, asumimos que la subdivisión planar está contenida dentro de un cuadro delimitador cuadrado.
Descomposición de la losa

La estructura de datos más simple y temprana que logra un tiempo O(log n ) fue descubierta por Dobkin y Lipton en 1976. Se basa en subdividir S usando líneas verticales que pasan por cada vértice en S. La región entre dos líneas verticales consecutivas se llama losa . Nótese que cada losa está dividida por segmentos de línea que no se intersecan y que cruzan completamente la losa de izquierda a derecha. La región entre dos segmentos consecutivos dentro de una losa corresponde a una cara única de S. Por lo tanto, reducimos nuestro problema de localización de puntos a dos problemas más simples: [ 2 ]
- Dada una subdivisión del plano en losas verticales, determine qué losa contiene un punto dado.
- Dada una losa subdividida en regiones por segmentos que no se intersecan y que la atraviesan completamente de izquierda a derecha, determine qué región contiene un punto dado.
El primer problema se puede resolver mediante búsqueda binaria en la coordenada x de las líneas verticales en tiempo O(log n ). El segundo problema también se puede resolver en tiempo O(log n ) mediante búsqueda binaria. Para ver cómo, observe que, como los segmentos no se intersecan ni cruzan completamente la losa, se pueden ordenar verticalmente dentro de cada losa. Si bien este algoritmo permite la localización de puntos en tiempo logarítmico y es fácil de implementar, el espacio requerido para construir las losas y las regiones contenidas dentro de ellas puede ser tan alto como O( n² ), ya que cada losa puede cruzar una fracción significativa de los segmentos. [ 2 ]
Varios autores observaron que los segmentos que cruzan dos losas adyacentes son en su mayoría iguales. Por lo tanto, el tamaño de la estructura de datos se puede reducir significativamente. Más específicamente, Sarnak y Tarjan barren una línea vertical l de izquierda a derecha sobre el plano, manteniendo los segmentos que intersecan l en un árbol rojo-negro persistente . Esto les permite reducir el espacio de almacenamiento a O( n ), manteniendo el tiempo de consulta de O(log n ). [ 3 ]
Subdivisiones monótonas

Una cadena monótona (vertical) es un camino tal que la coordenada y nunca aumenta a lo largo del camino. Un polígono simple es monótono (vertical) si está formado por dos cadenas monótonas, con el primer y el último vértice en común. Es posible añadir algunas aristas a una subdivisión planar para que todas las caras sean monótonas, obteniendo así una subdivisión monótona. Este proceso no añade ningún vértice a la subdivisión (por lo tanto, el tamaño sigue siendo O( n )) y puede realizarse en tiempo O( n log n ) mediante barrido plano (también puede realizarse en tiempo lineal utilizando triangulación de polígonos ). Por lo tanto, no hay pérdida de generalidad si restringimos nuestra estructura de datos al caso de subdivisiones monótonas, como hacemos en esta sección.
La debilidad de la descomposición en losa radica en que las líneas verticales crean segmentos adicionales, lo que dificulta alcanzar un espacio de almacenamiento O( n ). Herbert Edelsbrunner , Leonidas J. Guibas y Jorge Stolfi descubrieron una estructura de datos óptima que utiliza únicamente las aristas en una subdivisión monótona. La idea consiste en emplear cadenas monótonas verticales, en lugar de líneas verticales, para particionar la subdivisión. [ 4 ]
Convertir esta idea general en una estructura de datos eficiente no es tarea sencilla. Primero, necesitamos poder calcular una cadena monótona que divida la subdivisión en dos mitades de tamaños similares. Segundo, dado que algunas aristas pueden estar contenidas en varias cadenas monótonas, debemos asegurarnos de que el espacio de almacenamiento sea O(n). Tercero, comprobar si un punto está a la izquierda o a la derecha de una subdivisión monótona requiere un tiempo de O( n ) si se realiza de forma ingenua. [ 4 ]
Los detalles sobre cómo resolver los dos primeros problemas están fuera del alcance de este artículo. Mencionamos brevemente cómo abordar el tercer problema. Mediante la búsqueda binaria, podemos comprobar si un punto está a la izquierda o a la derecha de una cadena monótona en tiempo O(log n ). Dado que necesitamos realizar otra búsqueda binaria anidada a través de O(log n ) cadenas para determinar la ubicación del punto, el tiempo de consulta es O(log² n). Para lograr un tiempo de consulta O(log n ), necesitamos utilizar la cascada fraccionaria , manteniendo punteros entre las aristas de diferentes cadenas monótonas. [ 4 ]
refinamiento de triangulación

Un polígono con m vértices se puede particionar en m – 2 triángulos. Esto se puede demostrar por inducción partiendo de un triángulo. Existen numerosos algoritmos para triangular un polígono de manera eficiente, siendo el más rápido de O( n ) tiempo en el peor de los casos. Por lo tanto, podemos descomponer cada polígono de nuestra subdivisión en triángulos y restringir nuestra estructura de datos al caso de subdivisiones formadas exclusivamente por triángulos. Kirkpatrick proporciona una estructura de datos para la localización de puntos en subdivisiones trianguladas con un espacio de almacenamiento de O( n ) y un tiempo de consulta de O(log n ). [ 5 ]
La idea general es construir una jerarquía de triángulos. Para realizar una consulta, comenzamos por encontrar el triángulo de nivel superior que contiene el punto de consulta. Dado que el número de triángulos de nivel superior está limitado por una constante, esta operación se puede realizar en tiempo O(1). Cada triángulo tiene punteros a los triángulos con los que se interseca en el siguiente nivel de la jerarquía, y el número de punteros también está limitado por una constante. Procedemos con la consulta encontrando qué triángulo contiene el punto de consulta nivel por nivel. [ 5 ]
La estructura de datos se construye en orden inverso, es decir, de abajo hacia arriba. Comenzamos con la subdivisión triangulada y elegimos un conjunto independiente de vértices para eliminar. Después de eliminar los vértices, volvemos a triangular la subdivisión. Dado que la subdivisión está formada por triángulos, un algoritmo voraz puede encontrar un conjunto independiente que contenga una fracción constante de los vértices. Por lo tanto, el número de pasos de eliminación es O(log n ). [ 5 ]
descomposición trapezoidal

Un enfoque aleatorio para este problema se basa en la descomposición trapezoidal o mapa trapezoidal. Esta descomposición se obtiene disparando balas verticales que van tanto hacia arriba como hacia abajo desde cada vértice de la subdivisión original. Las balas se detienen al chocar con una arista y forman una nueva arista en la subdivisión. De esta forma, obtenemos un subconjunto de la descomposición en losa, con solo O( n ) aristas y vértices, ya que por cada vértice de la subdivisión original solo añadimos dos nuevos vértices e incrementamos el número de aristas en cuatro. [ 6 ]
Una descomposición trapezoidal se puede construir añadiendo los segmentos de la subdivisión original, uno a uno, en orden aleatorio. Inicialmente (antes de que se haya añadido ningún segmento), la descomposición trapezoidal consiste en un único trapecio, el cuadro delimitador de la subdivisión. Cada paso subsiguiente utiliza una consulta de ubicación de puntos para localizar un extremo del siguiente segmento de línea, dentro de la descomposición trapezoidal actual, y luego recorre desde el trapecio resultante los trapecios vecinos que contienen el mismo segmento, subdividiéndolos y recombinándolos para formar la descomposición refinada. El análisis inverso , una forma de análisis comúnmente utilizada para este tipo de algoritmo de geometría incremental aleatoria, muestra que el número esperado de trapecios creados para cada inserción está limitado por una constante y, por lo tanto, que el número total de pasos de este algoritmo, excluyendo las ubicaciones de los puntos, es lineal. [ 6 ]
La localización de puntos en la subdivisión actual, realizada dentro de este algoritmo, puede hacerse utilizando la misma estructura que, al final del algoritmo, puede usarse para consultas de localización de puntos en la descomposición trapezoidal final. Esta estructura de datos de localización de puntos toma la forma de un grafo dirigido acíclico , donde los vértices son los trapecios que existían en algún momento del refinamiento, y las aristas dirigidas conectan cada trapecio que ya no está en el refinamiento con los trapecios que lo reemplazaron. Una consulta de localización de puntos se realiza siguiendo una ruta en este grafo, comenzando desde el trapecio inicial, y en cada paso eligiendo el trapecio de reemplazo que contiene el punto de consulta, hasta llegar a un trapecio que no ha sido reemplazado. La profundidad esperada de una búsqueda en este digrafo, comenzando desde cualquier punto de consulta, es O(log n ). El espacio para la estructura de datos es proporcional al número de trapecios creados a lo largo de este proceso de refinamiento, que en promedio es O( n ). [ 6 ]
Dimensiones superiores
No se conocen estructuras de datos generales para la localización de puntos con espacio lineal y tiempo de consulta logarítmico para dimensiones mayores que 2. Por lo tanto, debemos sacrificar tiempo de consulta o espacio de almacenamiento, o bien restringirnos a algún tipo de subdivisión menos general.
En el espacio tridimensional, es posible responder consultas de ubicación de puntos en O(log² n ) utilizando un espacio de O( n log n ). La idea general consiste en mantener varias estructuras de datos planares de ubicación de puntos, correspondientes a la intersección de la subdivisión con n planos paralelos que contienen cada vértice de la subdivisión. Un uso ingenuo de esta idea aumentaría el espacio de almacenamiento a O( n ² ). De la misma manera que en la descomposición en losas, se puede aprovechar la similitud entre estructuras de datos consecutivas para reducir el espacio de almacenamiento a O( n log n ), pero el tiempo de consulta aumenta a O(log² n ). [ 7 ]
En un espacio d -dimensional, la localización de puntos se puede resolver proyectando recursivamente las caras en un espacio ( d -1)-dimensional. Mientras que el tiempo de consulta es O(log n ), el espacio de almacenamiento puede ser tan alto comoLa elevada complejidad de las estructuras de datos d -dimensionales llevó al estudio de tipos especiales de subdivisión.
Un ejemplo importante es el caso de arreglos de hiperplanos . Un arreglo de n hiperplanos define O( n d ) celdas, pero la ubicación de puntos se puede realizar en O(log n ) tiempo con O( n d ) espacio utilizando los cortes jerárquicos de Chazelle .
Otro tipo especial de subdivisión se denomina subdivisión rectilínea (u ortogonal). En una subdivisión rectilínea, todos los bordes son paralelos a uno de los d ejes ortogonales. En este caso, la localización de un punto se puede determinar en un tiempo de O(log d -1 n ) con un espacio de O( n ).
Referencias
Notas
- ↑ Berna 1990 .
- 1 2 Dobkin y Lipton 1976 .
- ↑ Sarnak y Tarjan 1986 .
- 1 2 3 Edelsbrunner, Guibas y Stolfi 1986 .
- 1 2 3 Kirkpatrick 1983 .
- 1 2 3 de Berg et al. 2000 .
- ↑ Goodrich, Michael T.; Tamassia, Roberto (1998). "Árboles dinámicos y localización dinámica de puntos" . SIAM Journal on Computing . 28 (2): 612– 636. doi : 10.1137/S0097539793254376 .
Fuentes
- de Berg, Mark; van Kreveld, Marc; Overmars, Marcos ; Schwarzkopf, Otfried (2000). «Capítulo 6: Ubicación del punto» . Geometría computacional (2ª edición revisada). Springer-Verlag . págs. 121-146 . ISBN 3-540-65620-0.
- Bern, Marshall (1990). "Eliminación de superficies ocultas para rectángulos" . Journal of Computer and System Sciences . 40 (1): 49– 69. doi : 10.1016/0022-0000(90)90018-G . MR 1047289 .
- Dobkin, David ; Lipton, Richard J. (1976). "Problemas de búsqueda multidimensional". SIAM Journal on Computing . 5 (2): 181– 186. doi : 10.1137/0205015 .
- Edelsbrunner, Herbert ; Guibas, Leonidas J .; Stolfi, Jorge (1986). "Ubicación óptima de puntos en una subdivisión monótona". SIAM Journal on Computing . 15 (2): 317– 340. doi : 10.1137/0215023 .
- Kirkpatrick, David G. (1983). "Búsqueda óptima en subdivisiones planares". SIAM Journal on Computing . 12 (1): 28– 35. CiteSeerX 10.1.1.461.1866 . doi : 10.1137/0212002 .
- Sarnak, Neil; Tarjan, Robert E. (1986). "Localización de puntos planares mediante árboles de búsqueda persistentes" . Communications of the ACM . 29 (7): 669– 679. doi : 10.1145/6138.6151 .
Lecturas adicionales
- Snoeyink, Jack (2004). «Capítulo 34: «Localización de puntos»». En Goodman, Jacob E .; O'Rourke, Joseph (eds.). Manual de geometría discreta y computacional (2.ª ed.). Chapman & Hall/CRC. ISBN 1-58488-301-4.
Enlaces externos
- Repositorio de fuentes de localización puntual en la Universidad de Stony Brook
- Consultas de localización de puntos en CGAL , la biblioteca de algoritmos de geometría computacional.
- Estructuras de datos geométricos
- Algoritmos geométricos