You are on page 1of 14

Captulo 3

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.

El siguiente grfico muestra un diagrama de Voronoi de una nube de puntos:

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.

Distribucin de servicios pblicos (hospitales, centros comerciales...). La ubicacin de dichos


establecimientos "debera ser" (al menos tericamente) la que tenga la mayor rea de regin de Voronoi
con respecto al resto de establecimientos del mismo tipo, para as aumentar la hipottica clientela. Como
comentario a este ltimo caso, podramos realizar una serie de modificaciones al planteamiento:
pensemos en el caso de la ubicacin de hospitales. A un determinado enfermo siempre le interesara
acudir al hospital ms cercano a su domicilio segn la distancia eucldea. Para saber a cual acudir no
tenda ms que mirar el Diagrama de Voronoi de los puntos que indican la posicin de los hospitales y
comprobar en que regin se encuentra su casa. Ahora bien, tambin podra ser interesante considerar a
ciertos hospitales como ms cercanos si tienen, por ejemplo, mejor acceso (autopista...) o si tienen un
mayor nmero de camas. En este caso cada uno de los puntos (hospitales en nuestro caso) puede tener
asignado un determinado "peso", con lo que el Diagrama de Voronoi de la nube de hospitales podra
cambiar notablemente al llevarse una mayor zona de influencia (cercana) el hospital con ms peso.

Quiz un ejemplo grfico ilustre mejor esta idea:


El hospital h al tener un peso mayor, arrebata a los puntos ms cercanos, zonas que segn la distancia
eucldea estaran ms prximas a ellos. La lneas finas muestran el Diagrama de Voronoi del conjunto de
puntos sin peso y la zona ms gruesa sera la resultante de asignar un hipottico peso a h.

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.

3.2. CONCEPTOS TERICOS.


Denotamos la distancia Eucldea entre dos puntos del plano como dist(p,q).siendo:

Sea P = {p1,p2,...,pn} un conjunto de n puntos distintos en el plano. Definimos el diagrama de Voronoi de


P como la subdivisin del plano en n regiones, cada una correspondiente a un punto de P, cumpliendo,
que un punto q pertenece a la regin correspondiente al punto pisi y solamente si dist(q,pi) < dist(q,pj)
para cada punto pj P, con j distinto de i. Denotamos el diagrama de Voronoi de P como Vor(P). La regin
correspondiente al punto pi es llamada V(pi).

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.

Se observa claramente en el grfico anterior.

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.

3.3. ALGORITMO DE FORTUNE


3.3.1. Introduccin

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.

3.3.2. Visin Grfica del Algoritmo de Fortune

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.

Partimos de un conjunto S de n puntos en el plano x-y, cumplindose de no existen cuatro puntos


cocirculares.

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.

Vemamos ahora el mecanismo de barrido de este algoritmo:

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.

Si hacemos ahora hacemos tambin opaco el plano de barrido podemos observar:

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.

En el siguiente grfico podemos observar la proyeccin en el eje x-y:


La frontera de la unin de todas las parbolas es lo que se denomina frente parablico o lnea de playa.

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.

Si observamos por debajo del plano x-y:

Cada arco del frente parablico cae en una regin de Voronoi.


Cada punto de corte entre dos arcos consecutivos del frente parablico cae en uno de los lados del
Diagrama de Voronoi.
Podemos afirmar que cada punto de un lado del Diagrama de Voronoi, ser un punto de corte entre dos
arcos consecutivos del frente parablico, en algn momento, durante el proceso de barrido.

Es decir, estamos construyendo el Diagrama de Voronoi.

En la evolucin del frente parablico surgen dos tipos de eventos que trataremos a continuacin:

Eventos de Punto (Site Events)


Eventos de Crculo (Circle Events)

3.3.2.1. Eventos de Punto (Site Events)

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.

3.3.2.2. Eventos de Crculo (Circle Events)

Veamos ahora que ocurre cuando una arco va decreciendo en el frente parablico hasta convertirse en un
punto y desaparecer de dicho frente.

Vemoslo con un grfico:


En la figura 1 se observa que A1, A2 y A3 son tres arcos consecutivos del frente parablico
correspondientes a los puntos p1, p2 y p3 respectivamente. El arco A2 se va estrechando debido al
crecimiento de A1 y A2. En la figura 2 se observa justo el momento en el que el arco A2 abandona el
frente parablico formando un punto de corte entre A1 y A3 que hemos llamado u, u es equidistante de
p1, p2 y p3, es decir, es el centro de la circunferencia que pasa por p1, p2 y p3. Al mismo tiempo esta
circunferencia es tangente a la lnea de barrido en un punto que hemos llamado w, justamente este punto
es lo que llamaremos evento de crculo (circle event). Cuando la lnea de barrido est sobre este punto (w)
se est generando un vrtice del Diagrama de Voronoi y a partir de este momento comienza a crecer a
partir de l un nuevo lado del Diagrama de Voronoi, tal y como se puede apreciar en la figura 3.
Un circle event es la nica forma de que un arco abandone el frente parablico.

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.

3.3.3. Estrategia del Algoritmo de Fortune

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.

Si denotamos ly a la coordenada y de la lnea de barrido, la ecuacin de la parbola Bj para el punto


pj=(pj,x,p,jy) ser:

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.

Veamos las estructuras de datos que nos pueden ser tiles.

3.3.3.1. Estructuras de Datos

Para mantener los cambios del frente parablico segn va movindose la lnea de barrido necesitaremos
las siguientes estructuras de datos estndar:

Una estructura para almacenar el Diagrama de Voronoi en construccin (DCEL)

Una estructura del estado de la lnea de playa (rbol binario de bsqueda equilibrado).

Una cola de eventos (Cola con prioridades)

3.3.3.1.1. Estructura DCEL

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.

La estructura DCEL, est formada por tres colecciones de registros:

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...

3.3.3.1.2. rbol binario de bsqueda balanceado

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.

3.3.3.1.3. Cola de eventos

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.

3.3.4. El algoritmo de Fortune

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.

Salida: El Diagrama de Voronoi Vor(P) dentro de un rectngulo en una estructura DCEL.

1. Inicializar la cola de eventos Q con todos los Site Events.

2. mientras Q no est vacio

3. hacer Considerar el evento con mayor coordenada y de Q.

4. si el evento es un Site Event del punto pi

5. entonces TRATAR_SITE_EVENT (pi)

6. en caso contrario TRATAR_CIRCLE_EVENT(pl), donde pl es el punto ms bajo

del crculo que causa el evento.

7. Eliminar el evento de Q.

8. Los nodos internos presentes todava en T (rbol binario) pertenecen a los

medios-lados infinitos del Diagrama de Voronoi. Calcular un rectngulo que

contenga todos los vrtices del Diagrama de Voronoi en su interior,unindole

los medios-lados infinitos, modificando la estructura DCEL apropiadamente.


Nos han surgido dos nuevos procedimientos:

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.

3.3.5. Complejidad del algoritmo

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.

De todas estas apreciaciones es sencillo deducir la complejidad anteriormente afirmada.

You might also like