
El algoritmo de Fortune es un algoritmo de barrido lineal para generar un diagrama de Voronoi a partir de un conjunto de puntos en un plano utilizando un tiempo de O ( n log n ) y un espacio de O( n ). [ 1 ] [ 2 ] Fue publicado originalmente por Steven Fortune en 1986 en su artículo "Un algoritmo de barrido lineal para diagramas de Voronoi". [ 3 ]
Descripción del algoritmo
El algoritmo mantiene una línea de barrido y una línea de playa , las cuales se mueven a través del plano a medida que avanza el algoritmo. La línea de barrido es una línea recta que, por convención, podemos asumir vertical y que se mueve de izquierda a derecha a través del plano. En cualquier momento durante el algoritmo, los puntos de entrada a la izquierda de la línea de barrido se habrán incorporado al diagrama de Voronoi, mientras que los puntos a la derecha de la línea de barrido aún no se habrán considerado. La línea de playa no es una línea recta, sino una curva compleja, segmentada , a la izquierda de la línea de barrido, compuesta por segmentos de parábolas ; divide la porción del plano dentro de la cual se puede conocer el diagrama de Voronoi, independientemente de qué otros puntos puedan estar a la derecha de la línea de barrido, del resto del plano. Para cada punto a la izquierda de la línea de barrido, se puede definir una parábola de puntos equidistantes de ese punto y de la línea de barrido; la línea de playa es el límite de la unión de estas parábolas. A medida que avanza la línea de barrido, los vértices de la línea de playa, donde se cruzan dos parábolas, trazan los bordes del diagrama de Voronoi. La línea de playa avanza manteniendo la base de cada parábola exactamente a medio camino entre los puntos inicialmente barridos y la nueva posición de la línea de barrido. Matemáticamente, esto significa que cada parábola se forma utilizando la línea de barrido como directriz y el punto de entrada como foco.
El algoritmo mantiene como estructuras de datos un árbol de búsqueda binaria que describe la estructura combinatoria de la línea de playa y una cola de prioridad que enumera los posibles eventos futuros que podrían modificar dicha estructura. Estos eventos incluyen la adición de otra parábola a la línea de playa (cuando la línea de barrido cruza otro punto de entrada) y la eliminación de una curva de la línea de playa (cuando la línea de barrido se vuelve tangente a un círculo que pasa por tres puntos de entrada cuyas parábolas forman segmentos consecutivos de la línea de playa). Cada evento se puede priorizar según la coordenada x de la línea de barrido en el punto donde ocurre. El algoritmo consiste entonces en eliminar repetidamente el siguiente evento de la cola de prioridad, encontrar los cambios que este evento provoca en la línea de playa y actualizar las estructuras de datos.
Como hay O( n ) eventos para procesar (cada uno asociado con alguna característica del diagrama de Voronoi) y O(log n ) tiempo para procesar un evento (cada uno consta de un número constante de operaciones de árbol de búsqueda binaria y cola de prioridad), el tiempo total es O( n log n ).
Pseudocódigo
Descripción en pseudocódigo del algoritmo. [ 4 ]
dejarser la transformación, dóndees la distancia euclidiana entre z y el sitio más cercano sea T la "línea de playa" seaSea la región cubierta por el sitio p . Sea el rayo límite entre los sitios p y q . Sea un conjunto de sitios en los que se aplicará este algoritmo. Sea X el conjunto de sitios extraídos de S con la mínima coordenada y , ordenados por la coordenada x. Sea DeleteMin( X ) la acción de eliminar el sitio más bajo y el más a la izquierda de X (ordenar por y a menos que sean idénticos, en cuyo caso ordenar por x). Sea V el mapa de Voronoi de S que se construirá mediante este algoritmo. crear rayos límite verticales inicialesmientras no IsEmpty( Q ) hacer p ← DeleteMin( Q ) caso p de p es un sitio en: encontrar la ocurrencia de una regiónen T que contiene p , entre paréntesis pora la izquierda yA la derecha se crean nuevos rayos límiteycon bases p reemplazarconen T eliminar de Q cualquier intersección entreyinsertar en Q cualquier intersección entreyinsertar en Q cualquier intersección entreyp es un vértice de Voronoi en: sea p la intersección dea la izquierda ya la derecha dejaser el vecino izquierdo dey dejarser el vecino adecuado deen T si, crea un nuevo rayo límitede lo contrario, si p está a la derecha del mayor de q y s , creade lo contrario crearfin si reemplazarcon recién creadoen T eliminar de Q cualquier intersección entreyeliminar de Q cualquier intersección entreyinsertar en Q cualquier intersección entreyinsertar en Q cualquier intersección entrey registro p como la cima deyy la base de generar los segmentos de límiteyfin de caso fin mientras generar los rayos límite restantes en T
Sitios y discos ponderados
sitios ponderados aditivamente
Como describe Fortune en la referencia [ 1 ], se puede utilizar una versión modificada del algoritmo de línea de barrido para construir un diagrama de Voronoi ponderado aditivamente , en el que la distancia a cada sitio se compensa con el peso del sitio; esto puede verse equivalentemente como un diagrama de Voronoi de un conjunto de discos, centrados en los sitios con un radio igual al peso del sitio. Se ha descubierto que el algoritmo tienecomplejidad temporal donde n es el número de sitios según la referencia [ 1 ]
Los puntos ponderados pueden utilizarse para controlar las áreas de las celdas de Voronoi al construir diagramas de Voronoi para mapas de árbol . En un diagrama de Voronoi con ponderación aditiva, la bisectriz entre puntos es, en general, una hipérbola, a diferencia de los diagramas de Voronoi sin ponderación y los diagramas de potencia de discos, para los cuales es una línea recta.
Referencias
- 1 2 3 de Berg, Mark ; van Kreveld, Marc ; Overmars, Marcos ; Schwarzkopf, Otfried (2000), Geometría computacional (segunda edición revisada), Springer-Verlag , ISBN 3-540-65620-0Sección 7.2: Cálculo del diagrama de Voronoi: págs. 151-160 .
- ↑ Austin, David, Diagramas de Voronoi y un día en la playa , Columna de opinión, Sociedad Matemática Estadounidense.
- ↑ Steven Fortune. Un algoritmo de barrido lineal para diagramas de Voronoi. Actas del segundo simposio anual sobre geometría computacional . Yorktown Heights, Nueva York, Estados Unidos, págs. 313-322 . 1986. ISBN 0-89791-194-6Biblioteca Digital ACM SpringerLink
- ↑ Kenny Wong, Hausi A. Müller , Una implementación eficiente del algoritmo de barrido de planos de Fortune para diagramas de Voronoi , CiteSeerX 10.1.1.83.5571 .
Enlaces externos
- Implementación en C de Steven Fortune
- Algoritmo de Voronoi de Fortune implementado en C++
- El algoritmo de Fortune, implementado en JavaScript, se encuentra archivado en GitHub desde agosto de 2015.
- El acceso a la visualización del algoritmo de Fortune está bloqueado a partir de 2025.
- Algoritmos geométricos
