Professional Documents
Culture Documents
DIAGRAMAS DE VORONOI
3.1. INTRODUCCIN
3.2. CONCEPTOS TERICOS
3.2.1. Observaciones
3.2.1.1. Observacin 1
3.2.1.2. Observacin 2
3.2.1.3. Observacin 3
3.2.1.4. Observacin 4
3.3. ALGORITMO DE FORTUNE
3.3.1. Introduccin
3.3.2. Visin Grfica del Algoritmo de Fortune
3.3.2.1. Eventos de Punto (Site Events)
3.3.2.2. Eventos de Crculo (Circle Events)
3.3.3. Estrategia del Algoritmo de Fortune
3.3.3.1. Estructuras de Datos
3.3.3.1.1. Estructura DCEL
3.3.3.1.2. rbol binario de bsqueda balanceado
3.3.3.1.3. Cola de eventos
3.3.4. El algoritmo de Fortune
3.3.5. Complejidad del algoritmo
3.1. INTRODUCCIN.
Un Diagrama de Voronoi de un conjunto de puntos en el plano, no es ms que la subdivisin del mismo
en regiones formadas por los lugares ms prximos a cada uno de los puntos.
De los Diagramas de Voronoi ya hablaba Descartes cuando afirmaba que el sistema solar estaba formado
por vrtices, pero fueron Dirichlet, Voronoi y Thiessen los que profundizaron en el estudio de estos
diagramas.
Son muchas las utilidades de los Diagramas de Voronoi entre las que podemos citar:
Posicionamiento de torretas en telefona mvil. La regin de Voronoi de cada una de las torretas
determinara qu telfonos deberan realizar la conexin a travs de la misma.
Control areo. El Diagrama de Voronoi de cada centro de control, determinara la zona de espacio areo
a controlar por dicha estacin.
Variedades sobre los Diagramas de Voronoi aparecen utilizando mtricas distintas a la eucldea. No es el
objeto de este Trabajo de Fin de Carrera en tratar estos Diagramas, existiendo abundante bibliografa
sobre el tema. Nos centraremos pues, en los Diagramas de Voronoi en el plano y utilizaremos la distancia
comn, la distancia eucldea.
A parte de las mencionadas utilidades de estos diagramas podemos citar: el posicionamiento de brazos
robticos, posicionamiento de torretas de visin de zonas forestales para el control de fuegos...
Comenzaremos despus de esta introduccin con los conceptos tericos de los Diagramas de Voronoi.
Observemos por un momento la estructura de una nica regin de Voronoi. Para dos puntos p y q en el
plano definimos el bisector de p y q como el bisector perpendicular del segmento pq. Este bisector divide
el plano en dos semiplanos. Denotamos el semiplano que contiene a p como h(p,q) y al semiplano que
contiene a q como h(q,p). Se puede observar que r pertenece a h(p,q) si y solamente si dist(r,p) <
dist(r,q). Podemos obtener de aqu las siguientes observaciones:
3.2.1. Observaciones
Veamos algunas observaciones sobre los Diagramas de Voronoi.
3.2.1.1. Observacin 1
Esto es, V(pi) es la interseccin de n-1 semiplanos y por tanto una regin poligonal convexa con como
mximo n-1 vertices y n-1 lados. Es decir, que la regin de Voronoi de un determinado punto, consistir
en la interseccin de todos los semiplanos h(pi,pj).
Obviamente ste no sera un algoritmo eficiente para el clculo del Diagrama de Voronoi de la nube de
puntos completa ya que habra que repetir el proceso para los n puntos de la nube.
3.2.1.2. Observacin 2
Si todos los puntos de P son colineales, entonces Vor(P) (Diagrama de Voronoi de P) estar formada por
n-1 lineas paralelas y n regiones.
3.2.1.3. Observacin 3
Un Diagrama de Voronoi de una nube de puntos en el plano tiene a lo sumo 2n-5 vrtices y 3n-6 lados.
La demostracin de sta y otras propiedades pueden encontrarse en la bibliografa que se lista al final de
este trabajo.
3.2.1.4. Observacin 4
Para un conjunto de puntos P del plano, un punto q es vrtice del Diagrama de Voronoi de P si y
solamente si el crculo vaco de mayor tamao con centro en q contiene tres o ms puntos de P sobre su
circunferencia.
En el siguiente grfico se muestra el Diagrama de Voronoi de los puntos p1, p2 y p3, se puede observar
que el punto q es vrtice del Diagrama de Voronoi ya que la circunferencia mayor vaca contiene
precisamente a los tres puntos.
Un primer algoritmo para el clculo del Diagrama de Voronoi en el que podramos pensar a la vista de las
observaciones anteriores sera, el de computar las intersecciones comunes de todos los semiplanos
h(pi,pj), para cada punto pi, con i distinto de j. Este algoritmo tendra una complejidad O(n log n) por
punto, necesitando O(n2 log n) para computar la totalidad del Diagrama.
Existe un algoritmo basado en el barrido plano, conocido como algoritmo de Fortune -debido a su
inventor- o de lnea de barrido que es capaz de calcular el Diagrama de Voronoi de una nube de puntos en
el plano con complejidad O(n log n), que es adems complejidad ptima para calcular el diagrama de
Voronoi.
Comenzaremos con una visin grfica inicial del algoritmo para posteriormente profundizar en los
conceptos tericos del mismo.
Vamos a realizar una primera justificacin grfica del mecanismo que utiliza el algoritmo de Fortune para
generar el Diagrama de Voronoi de un conjunto de puntos en el plano.
Creamos para cada punto un cono opaco, idntico a todos los dems, creciendo hacia el eje z.
Segn esto y observando el grfico anterior podemos afirmar:
Dos conos intersectan en una hiprbola que cae en un plano vertical al x-y.
Observando desde arriba (por encima del plano x-y), la interseccin entre dos conos es una lnea recta.
Esta lnea es la mediatriz en dos dimensiones de los dos puntos.
No todos los puntos de esta lnea son visibles, ya que pueden ser ocultados por el crecimiento de otros
conos.
De todo esto se puede deducir que, proyectando la interseccin visible de todos los conos sobre el plano
x-y se obtiene el diagrama de Voronoi del conjunto de puntos.
Partimos de un plano de barrido que se mueve de izquierda a derecha sobre el plano x-y con un ngulo de
inclinacin igual al de los conos, segn se muestra en el siguiente grfico:
El plano de barrido intersecta con el plano x-y en lo que llamamos lnea de barrido.
La interseccin del plano de barrido con el cono proyectada sobre el plano x-y es una parbola con foco
en el punto p (segn el grfico) y directriz la lnea de barrido.
El plano de barrido oculta los conos que nacen a la derecha de la lnea de barrido.
Los conos visibles que todava no han sido totalmente barridos por el plano de barrido proyectarn sobre
el plano x-y un conjunto de parbolas apuntando hacia la izquierda, con ejes paralelos y distintas
anchuras.
Podemos observar que hacia la derecha de la lnea de barrido el plano de barrido al ser opaco oculta todos
los conos y bloquea su visin desde abajo, en cambio hacia la izquierda el plano de barrido cae por
encima de uno o ms conos y por tanto no bloquea sus vistas desde abajo.
En la evolucin del frente parablico surgen dos tipos de eventos que trataremos a continuacin:
Cuando la lnea de barrido pasa justamente por encima de un punto, una parbola degenerada (ancho 0) se
une al frente parablico, esta parbola parte una arco existente en el frente parablico en dos. La
evolucin posterior de esta parbola durante el proceso de barrido dar lugar a un nuevo lado del
Diagrama de Voronoi. El siguiente grfico muestra la evolucin en la creacin de un lado de Voronoi:
En la figura 1 la lnea de barrido no ha llegado al punto, en la 2 justamente est sobre el punto, se crea la
parbola degenerada que divide en dos uno de los arcos del frente parablico y en la figura 3 ha pasado la
lnea y se observa la evolucin del nuevo lado del Diagrama Voronoi.
Llamaremos pues, evento de punto (site event) cuando la lnea de barrido pasa justamente por encima de
uno de los puntos de la nube. Este es el nico modo de aadir un nuevo arco al frente parablico y
provoca la aparicin de un nuevo lado del Diagrama de Voronoi.
Veamos ahora que ocurre cuando una arco va decreciendo en el frente parablico hasta convertirse en un
punto y desaparecer de dicho frente.
La cuestin ahora es: despus de esta primera aproximacin grfica, qu estructuras de datos optimas
debo utilizar? y qu partes del frente parablico debo guardar durante el proceso de barrido para
conseguir finalmente el Diagrama de Voronoi de la nube de puntos inicial?. Para ello comenzaremos,
ahora s, con los conceptos tericos necesarios para contestar a estas preguntas.
La estrategia de este algoritmo consiste, como hemos comentado anteriormente, en realizar un barrido
con una lnea recta desde arriba a abajo del plano (cambiamos el orden del barrido con respecto a la
visin grfica, sin que ello influya en los razonamientos). Mientras la lnea se va moviendo, la
informacin no cambia, excepto en ciertos puntos llamados puntos evento, que tambin fueron
comentados en el apartado anterior.
El algoritmo pretende mantener la parte del diagrama de Voronoi por encima de la lnea de barrido que no
se ve afectada por puntos situados por debajo de dicha lnea.
Denotamos l a la lnea de barrido y l+ al semiplano por encima de l. Es claro que la distancia de un punto
q perteneciente a l+ a cualquier lugar por debajo de l es mayor que la distancia de q a l, esto significa que
los puntos ms cercanos a q no pueden estar por debajo de l si q es al menos tan cercano a algn pi
perteneciente a l+ como q lo es a l. Los puntos que son mas cercanos a algn punto pi perteneciente a l+
que a l estn limitados por una parbola, por lo tanto el lugar de los puntos que son mas cercanos a algn
punto por encima de l que a l mismo est limitado por arcos parablicos. A la secuencia de estos arcos
parablicos es lo que llamaremos lnea de playa o frente parablico.
Otra forma de visualizar la lnea de playa sera: cada punto pi define una parbola completa Bi, la lnea de
playa sera la funcin que para cada coordenada x pasa por el punto ms bajo de todas las parbolas.
Se puede observar que cada lnea vertical intersecta exactamente en un nico punto del frente parablico
y que los puntos de corte entre arcos consecutivos del frente parablico caen encima de los lados del
Diagrama de Voronoi.
En lugar de mantener la interseccin de VOR(P) con l, mantendremos la lnea de playa cuando la lnea de
barrido se va desplazando hacia abajo.
Tambin comentamos en la visin grfica del algoritmo que cuando la lnea de barrido pase exactamente
por encima de uno de los puntos, una parbola de ancho 0 se unir al frente parablico y a medida que la
lnea de barrido siga avanzando, un lado del Diagrama de Voronoi ir creciendo. Este punto es lo que
denominamos Site Event.
La nica forma de que aparezca un nuevo arco en el frente parablico es a travs de un Site Event.
Tambin vimos en la visin grfica del algoritmo, que la nica forma de que un arco abandone el frente
parablico es la aparicin de un Circle Event, que formara un vrtice del Diagrama de Voronoi y a partir
de ese momento un nuevo lado del Diagrama de Voronoi comenzara a crecer.
Mientras que todos los Site Events son conocidos al comienzo del barrido, durante el mismo, aparecern
nuevos Circle Events y otros sern eliminados al no poderse producir en la posicin actual de la lnea de
barrido.
La idea es, mantener el frente parablico en los puntos evento, actualizado estructuras ptimas para el
manejo de dichos eventos.
Para mantener los cambios del frente parablico segn va movindose la lnea de barrido necesitaremos
las siguientes estructuras de datos estndar:
Una estructura del estado de la lnea de playa (rbol binario de bsqueda equilibrado).
DCEL son las siglas inglesas de lista de lados doblemente enlazados, sta ser la estructura de datos que
utilizaremos para almacenar la parte del Diagrama de Voronoi que vamos generando.
Lista de vrtices: Un registro para un vrtice v, almacena las coordenadas de v y un puntero a un lado
arbitrario con origen en v.
Lista de caras: Un registro para una cara c, almacena un puntero a un lado exterior a la cara y otro a uno
interior. Podemos ver, que es necesario aplicar una determinada orientacin a los lados, ya que hablamos
de medios-lados orientados, de esta forma un lado podra considerarse interno a una cara si est orientado
en sentido contrario a las agujas del reloj con respecto a la cara.
Lista de lados: Un registro para un lado l, almacenara un puntero al vrtice origen, un puntero a su lado
en sentido contrario, un puntero a la cara en la que se encuentra, un puntero al lado siguiente y otro al
anterior, todos ellos en el sentido contrario a las agujas del reloj (por ejemplo).
Adems, estas estructuras pueden almacenar otras informaciones no necesariamente topolgicas, como
colores...
sta ser la estructura que utilizaremos para almacenar el estado de la lnea de playa segn va avanzando
la lnea de barrido y se van tratando los eventos.
Las hojas en este rbol corresponden a los arcos del frente parablico de manera ordenada (la hoja ms a
la izquierda representa el arco ms a la izquierda).
Cada hoja tiene un puntero al punto que define esa parbola y los nodos internos representan los puntos
de corte entre arcos consecutivos del frente parablico.
Cada hoja mantiene un puntero al nodo de la cola de eventos que representa el Circle Event que har que
este arco desaparezca del frente parablico.
Adems en cada nodo interno se almacena otro puntero al lado de Voronoi que est generando el punto de
corte que representa.
En ella guardaremos los eventos, aadiremos nuevos y eliminaremos los que ya no se puedan ejecutar,
debido a que puede que ya sean obsoletos.
Se implementa como una cola de prioridades, donde la prioridad de un evento queda determinada por su
coordenada y. Para un Site Event se almacena su propia coordenada y, en cambio en un Circle Event se
almacenar el punto ms bajo del crculo. En el caso de un Circle Event, adems se almacenar un
puntero a la hoja del rbol binario que representa al arco que desaparecer del frente parablico en este
evento.
Tenemos ya todas las herramientas necesarias para atacar el algoritmo completamente. Veamos el
algoritmo en pseudocdigo:
DIAGRAMA_VORONOI (P)
Entrada: P := {p1,...,pn} un conjunto de n puntos en el plano.
7. Eliminar el evento de Q.
TRATAR_SITE_EVENT (pi)
TRATAR_CIRCLE_EVENT(pl)
Vemoslos detenidamente:
TRATAR_SITE_EVENT (pi)
Buscar en T (rbol de bsqueda) el arco a que cae verticalmente sobre pi, y borrar todos los
Circle Events que involucran a a de la cola Q.
Reemplazar la hoja de T que representa a a por un subrbol con tres hojas. En la hoja central
almacenaremos el nuevo punto pi y en las otras dos hojas almacenaremos el pj que originalmente
estaba almacenado con a. Almacenamos las tuplas <pj,pi> y <pi,pj> que representan los nuevos
puntos de corte de los dos nuevos nodos internos. Realizar operaciones de rebalanceado de T si es
necesario.
Crear nuevos registros en la estructura del Diagrama de Voronoi (DCEL) para los dos nuevos
medios-lados.
Chequear las tripletas de arcos consecutivos que involucren uno de los tres nuevos arcos. Insertar
el correspondiente Circle Event solamente si el crculo intersecta la lnea de barrido y el Circle
Event no estaba ya en Q.
TRATAR_CIRCLE_EVENT(pl)
Buscar en T (rbol de bsqueda) el arco a que cae verticalmente sobre pl, que es el va a
desaparecer, y borrar todos los Circle Events que involucran a a de la cola Q.
Borrar la hoja que representa a a de T. Actualizar las tuplas que representan los puntos de corte en
los nodos internos. Realizar operaciones de rebalanceado de T si es necesario.
Aadir el centro del crculo que causa el evento como un registro vrtice en la estructura del
Diagrama de Voronoi (DCEL) y crear dos nuevos medios-lados correspondientes al nuevo punto
de corte del Diagrama de Voronoi. Colocar los punteros entre ellos adecuadamente.
Chequear las nuevas tripletas de arcos consecutivos que surgen debido a la desaparicin del arco
a. Insertar el correspondiente Circle Event en Q solamente si el crculo intersecta la lnea de
barrido y el Circle Event no estaba ya en Q.
El algoritmo de Fortune corre con una complejidad O(n log n) y usa O(n) almacenamiento. Vemoslo
ms detenidamente:
Las operaciones primitivas sobre el rbol de bsqueda T y la cola de eventos Q, tales como, insertar o
borrar un elemento toman O(log n) tiempo cada una. Las operaciones primitivas en las estructura DCEL
toman tiempo constante. Para tratar un evento, realizamos un nmero constante de dichas operaciones
primitivas, por tanto gastamos O(log n) tiempo en procesar un evento. Obviamente tenemos n Site Events.
En cuanto a los Circle Events observamos que cada uno que es procesado define un vrtice del Diagrama
de Voronoi y que las falsas alarmas son borradas de Q antes de ser procesadas. Ests falsas alarmas son
creadas y borradas mientras se procesa un evento real, empleando un tiempo despreciable con respecto al
tiempo de proceso del evento. De esta forma el nmero mximo de Circle Events a procesar es de 2n-5.