Articulo de referencia

El algoritmo de Fortune

Animación del algoritmo de Fortune 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 ut...

Animación del algoritmo de Fortune
Animación del algoritmo de Fortune

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 ]

dejar(z){\displaystyle \scriptstyle *(z)}ser la transformación(z)=(zincógnita,zy+d(z)){\displaystyle \scriptstyle *(z)=(z_{x},z_{y}+d(z))}, dónded(z){\displaystyle \scriptstyle d(z)}es la distancia euclidiana entre z y el sitio más cercano sea T la "línea de playa" seaRpag{\displaystyle \scriptstyle R_{p}}Sea la región cubierta por el sitio p . dopagq{\displaystyle \scriptstyle C_{pq}}Sea el rayo límite entre los sitios p y q . S{\displaystyle \scriptstyle S}Sea un conjunto de sitios en los que se aplicará este algoritmo. pag1,pag2,...,pagmetro{\displaystyle \scriptstyle p_{1},p_{2},...,p_{m}}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. Qpag1,pag2,,pagmetro,S{\displaystyle Q\gets {p_{1},p_{2},\dots ,p_{m},S}}crear rayos límite verticales inicialesdopag1,pag20,dopag2,pag30,,dopagmetro1,pagmetro0{\displaystyle \scriptstyle C_{p_{1},p_{2}}^{0},C_{p_{2},p_{3}}^{0},\dots ,C_{p_{m-1},p_{m}}^{0}}T(Rpag1),dopag1,pag20,(Rpag2),dopag2,pag30,,(Rpagmetro1),dopagmetro1,pagmetro0,(Rpagmetro){\displaystyle T\gets *(R_{p_{1}}),C_{p_{1},p_{2}}^{0},*(R_{p_{2}}),C_{p_{2},p_{3}}^{0},\dots ,*(R_{p_{m-1}}),C_{p_{m-1},p_{m}}^{0},*(R_{p_{m}})}mientras no IsEmpty( Q ) hacer p ← DeleteMin( Q ) caso p de p es un sitio en(V){\displaystyle \scriptstyle *(V)}: encontrar la ocurrencia de una región(Rq){\displaystyle \scriptstyle *(R_{q})}en T que contiene p , entre paréntesis pordorq{\displaystyle \scriptstyle C_{rq}}a la izquierda ydoqs{\displaystyle \scriptstyle C_{qs}}A la derecha se crean nuevos rayos límitedopagq{\displaystyle \scriptstyle C_{pq}^{-}}ydopagq+{\displaystyle \scriptstyle C_{pq}^{+}}con bases p reemplazar(Rq){\displaystyle \scriptstyle *(R_{q})}con(Rq),dopagq,(Rpag),dopagq+,(Rq){\displaystyle \scriptstyle *(R_{q}),C_{pq}^{-},*(R_{p}),C_{pq}^{+},*(R_{q})}en T eliminar de Q cualquier intersección entredorq{\displaystyle \scriptstyle C_{rq}}ydoqs{\displaystyle \scriptstyle C_{qs}}insertar en Q cualquier intersección entredorq{\displaystyle \scriptstyle C_{rq}}ydopagq{\displaystyle \scriptstyle C_{pq}^{-}}insertar en Q cualquier intersección entredopagq+{\displaystyle \scriptstyle C_{pq}^{+}}ydoqs{\displaystyle \scriptstyle C_{qs}}p es un vértice de Voronoi en(V){\displaystyle \scriptstyle *(V)}: sea p la intersección dedoqr{\displaystyle \scriptstyle C_{qr}}a la izquierda ydors{\displaystyle \scriptstyle C_{rs}}a la derecha dejadoq{\displaystyle \scriptstyle C_{uq}}ser el vecino izquierdo dedoqr{\displaystyle \scriptstyle C_{qr}}y dejardosv{\displaystyle \scriptstyle C_{sv}}ser el vecino adecuado dedors{\displaystyle \scriptstyle C_{rs}}en T siqy=sy{\displaystyle \scriptstyle q_{y}=s_{y}}, crea un nuevo rayo límitedoqs0{\displaystyle \scriptstyle C_{qs}^{0}}de lo contrario, si p está a la derecha del mayor de q y s , creadoqs+{\displaystyle \scriptstyle C_{qs}^{+}}de lo contrario creardoqs{\displaystyle \scriptstyle C_{qs}^{-}}fin si reemplazardoqr,(Rr),dors{\displaystyle \scriptstyle C_{qr},*(R_{r}),C_{rs}}con recién creadodoqs{\displaystyle \scriptstyle C_{qs}}en T eliminar de Q cualquier intersección entredoq{\displaystyle \scriptstyle C_{uq}}ydoqr{\displaystyle \scriptstyle C_{qr}}eliminar de Q cualquier intersección entredors{\displaystyle \scriptstyle C_{rs}}ydosv{\displaystyle \scriptstyle C_{sv}}insertar en Q cualquier intersección entredoq{\displaystyle \scriptstyle C_{uq}}ydoqs{\displaystyle \scriptstyle C_{qs}}insertar en Q cualquier intersección entredoqs{\displaystyle \scriptstyle C_{qs}}ydosv{\displaystyle \scriptstyle C_{sv}} registro p como la cima dedoqr{\displaystyle \scriptstyle C_{qr}}ydors{\displaystyle \scriptstyle C_{rs}}y la base dedoqs{\displaystyle \scriptstyle C_{qs}} generar los segmentos de límitedoqr{\displaystyle \scriptstyle C_{qr}}ydors{\displaystyle \scriptstyle C_{rs}}fin 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 tieneO(norteregistro(norte)){\displaystyle O(n\log(n))}complejidad 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. 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 .
  2. Austin, David, Diagramas de Voronoi y un día en la playa , Columna de opinión, Sociedad Matemática Estadounidense.
  3. 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
  4. 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 .
  • 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.