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 ]

Sea la transformación , donde es la distancia euclidiana entre z y el sitio más cercano. Sea T la "línea de playa". Sea la región cubierta por el sitio p . Sea el rayo límite entre los sitios p y q . Sea un conjunto de sitios sobre los que se aplicará este algoritmo. Sean los sitios extraídos de S con la coordenada y mínima , 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 iniciales.(z){\displaystyle \scriptstyle *(z)}(z)=(zincógnita,zy+d(z)){\displaystyle \scriptstyle *(z)=(z_{x},z_{y}+d(z))}d(z){\displaystyle \scriptstyle d(z)}Rpag{\displaystyle \scriptstyle R_{p}}dopagq{\displaystyle \scriptstyle C_{pq}}S{\displaystyle \scriptstyle S}pag1,pag2,...,pagmetro{\displaystyle \scriptstyle p_{1},p_{2},...,p_{m}}Qpag1,pag2,,pagmetro,S{\displaystyle Q\gets {p_{1},p_{2},\dots ,p_{m},S}}dopag1,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 en T que contenga p ,(Rq){\displaystyle \scriptstyle *(R_{q})} entre paréntesis por a la izquierda y a la derecha crea nuevos rayos límite y con bases p reemplaza con en T elimina de Q cualquier intersección entre e inserta en Q cualquier intersección entre e inserta en Q cualquier intersección entre y p es un vértice de Voronoi en : sea p la intersección de a la izquierda y a la derecha sea el vecino izquierdo de y sea el vecino derecho de en T si , crea un nuevo rayo límite sino si p está a la derecha del mayor de q y s , crea sino crea fin si reemplaza con recién creado en T elimina de Q cualquier intersección entre y elimina de Q cualquier intersección entre e inserta en Q cualquier intersección entre e inserta en Q cualquier intersección entre y registra p como la cima de y y la base de imprime los segmentos límite y fin caso fin mientrasdorq{\displaystyle \scriptstyle C_{rq}}doqs{\displaystyle \scriptstyle C_{qs}}dopagq{\displaystyle \scriptstyle C_{pq}^{-}}dopagq+{\displaystyle \scriptstyle C_{pq}^{+}}(Rq){\displaystyle \scriptstyle *(R_{q})}(Rq),dopagq,(Rpag),dopagq+,(Rq){\displaystyle \scriptstyle *(R_{q}),C_{pq}^{-},*(R_{p}),C_{pq}^{+},*(R_{q})}Crq{\displaystyle \scriptstyle C_{rq}}Cqs{\displaystyle \scriptstyle C_{qs}}Crq{\displaystyle \scriptstyle C_{rq}}Cpq{\displaystyle \scriptstyle C_{pq}^{-}}Cpq+{\displaystyle \scriptstyle C_{pq}^{+}}Cqs{\displaystyle \scriptstyle C_{qs}}(V){\displaystyle \scriptstyle *(V)}Cqr{\displaystyle \scriptstyle C_{qr}}Crs{\displaystyle \scriptstyle C_{rs}}Cuq{\displaystyle \scriptstyle C_{uq}}Cqr{\displaystyle \scriptstyle C_{qr}}Csv{\displaystyle \scriptstyle C_{sv}}Crs{\displaystyle \scriptstyle C_{rs}}qy=sy{\displaystyle \scriptstyle q_{y}=s_{y}}Cqs0{\displaystyle \scriptstyle C_{qs}^{0}}Cqs+{\displaystyle \scriptstyle C_{qs}^{+}}Cqs{\displaystyle \scriptstyle C_{qs}^{-}}Cqr,(Rr),Crs{\displaystyle \scriptstyle C_{qr},*(R_{r}),C_{rs}}Cqs{\displaystyle \scriptstyle C_{qs}}Cuq{\displaystyle \scriptstyle C_{uq}}Cqr{\displaystyle \scriptstyle C_{qr}}Crs{\displaystyle \scriptstyle C_{rs}}Csv{\displaystyle \scriptstyle C_{sv}}Cuq{\displaystyle \scriptstyle C_{uq}}Cqs{\displaystyle \scriptstyle C_{qs}}Cqs{\displaystyle \scriptstyle C_{qs}}Csv{\displaystyle \scriptstyle C_{sv}}Cqr{\displaystyle \scriptstyle C_{qr}}Crs{\displaystyle \scriptstyle C_{rs}}Cqs{\displaystyle \scriptstyle C_{qs}}Cqr{\displaystyle \scriptstyle C_{qr}}Crs{\displaystyle \scriptstyle C_{rs}} 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 encontrado que el algoritmo tiene una complejidad temporal donde n es el número de sitios según la referencia [ 1 ] .O(nlog(n)){\displaystyle O(n\log(n))}

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.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Fortune%27s_algorithm&oldid=1320640602 "