SciELO - Scientific Electronic Library Online

 
vol.4 issue2Virtual Education based in Competences author indexsubject indexarticles search
Home Pagealphabetic serial listing  

Services on Demand

Article

Indicators

    Related links

    • Have no cited articlesCited by SciELO
    • Have no similar articlesSimilars in SciELO

    Bookmark

    Revista Investigación y Tecnología

    Print version ISSN 2306-0522

    Rev Inv Tec vol.4 no.2 La Paz Dec. 2016

     

    ARTÍCULOS

     

    Algoritmo de Fortune sin eventos de círculo usando la primitiva InCircle

     

    Fortune 's algorithm without circle events using InCircle primitive

     

     

    Lucio Torrico
    Instituto de Investigaciones en Informática Carrera de Informática
    Facultad de Ciencias Puras y Naturales Universidad Mayor de San Andrés
    La Paz - Bolivia
    Autor de correspondencia: luciotorrico@informatica.edu.bo
    Presentado: La Paz, 25 de octubre de 2016 Aceptado: La Paz, 20 de Diciembre de 2016

     

     


    Resumen

    Para hallar el diagrama de Voronoi (también llamado teselación de Dirichlet o polígonos de Thiessen) de un conjunto de puntos en el plano, el algoritmo de Fortune usa la propiedad de círculo vacío alrededor de los vértices de un modo implícito.

    Todas las presentaciones de dicho algoritmo usan eventos de círculo sin cálculos explícitos de la primitiva InCircle.

    El objetivo es averiguar si existe una versión alterna del algoritmo de Fortune sin eventos de círculo, utilizando exhaustivamente la primitiva InCircle.

    Se ha diseñado dicha variante del algoritmo, argumentado sus basamentos y, además de la presentación, se incluye un ejemplo de ejecución que permite aclarar su uso.

    Palabras clave: algoritmo de Fortune; diagrama de Voronoi., primitiva InCircle


    Abstract

    To find the Voronoi diagram (also called Dirich let tessellation or Thiessen polygons) from a set of points in the plane, Fortune 's algorithm use the empty-circle property around the vertices in an implicit way.

    All presentations of this algorithm use circle-events without explicit calculations of the primitive InCircle.

    Our goal is to find out if there is an alternate version of Fortune 's algorithm without circle-events, using exhaustively the primitive InCircle.

    We have designed this variant of the algorithm, argued their bases and, in addition to the presentation, include an execution example that allows clarify their use.

    Keywords: Fortune 's algorithm; InCircle primitive; Voronoi diagram


     

     

    Introducción

    Desde que (Guibas, L. 1, Stolfi, J., 1989) dieron una nueva presentación al algoritmo de Fortune (Fortune, 1987) para el cálculo del diagrama de Voronoi de un conjunto C de sitios o puntos en 2D, dicha presentación se ha popularizado hasta convertirse prácticamente en un estándar (De Berg et al. 1997, O'Rourke 1994).

    Aquí se presenta otra forma de calcular el diagrama, basados en dicho algoritmo pero sin utilizar eventos de círculo.

    La versión estándar que se relata, utiliza los llamados eventos de círculo de manera explícita y exhaustiva a partir de tripletas en la línea de playa, calculando el circuncentro de la circunferencia definida por los sitios de la tripleta, y luego restando el radio (previamente calculado) para hallar el punto más bajo de dicha circunferencia.

    En su lugar se calcula la primitiva InCircle para ver si un sitio está dentro del círculo definido por los tres sitios de una tripleta, de ser así la tripleta no es más que una falsa alarma. Si el sitio está fuera, o lo trabaja como un sitio más añadiéndolo a la línea de playa, o si está fuera y muy abajo se concluye que la circunferencia está vacía y define un vértice.

     

    Primitiva InCircle

    Dada una tripleta de puntos p1 p2 p3 no colineales (que en ese orden están en sentido antihorario), un nuevo punto p4 está dentro del círculo definido por la tripleta cuando:

    Lo que se conoce como la primitiva InCircle (p1,p2, p3,p4 ) (Gravesen 2012).

     

    Evento de sitio

    Cuando un sitio nuevo está en la punta de la cola, debe manejarse: corta a un arco, define tripletas, etc.

    Si está dentro del círculo de una tripleta previamente definida, dicha tripleta convergente es una falsa alarma, pues es una propiedad conocida (De Berg et al., 1997) que los vértices de un diagrama de Voronoi son el centro de círculos vacíos que tienen en el borde de su circunferencia tres (o más) sitios.

     

    La variante

    Para el cálculo del diagrama de Voronoi, no se maneja eventos de círculo, sólo eventos de sitio.

    La cola de prioridad Q contienen los sitios clasificados de mayor a menor de acuerdo a su ordenada. La lista doblemente enlazada D alberga las aristas y los vértices.

    Seguir manejando el concepto de tripleta, aunque los arcos centrales no apuntarán a nada en Q. Sí tendrán un indicador de que son centros de tripleta en caso de convergencia.

    Al bajar la línea de barrido: para determinar el nodo hoja que se corta, el orden de los subíndices de un nodo intermedio en el árbol T, importa:

    1) menor,MAYOR (por ej, <p1 p3>): representa una intersección izquierda (*)

    2) MAYOR,menor (por ej, < p3 p2>): representa una intersección derecha

    La variante se basa en el siguiente hecho: una tripleta convergente en el algoritmo estándar define un círculo, el arco central desaparece al llegar al circle-event añadiendo un vértice. Para el siguiente sitio ese arco ya no juega ningún rol (pues en dicho algoritmo estándar, se elimina). Ver un ejemplo en la Figura 1.

    Como no se tiene eventos de círculo, se debe identificar cuándo ha sobrepasado ese ficticio punto extremo de las ficticias circunferencias. Se explica con un ejemplo básico, pero generalizable: la línea de playa tiene este desarrollo (sin eventos de círculo). Luego de los tres primeros sitios:

    Se ha marcado el sitio que desaparecería en el ficticio evento de círculo.

    Cuando aparece p4, cortará a p3. El vecino derecho de p3 es p1 que tiene un indicador de que es centro de tripleta.

    Nótese que cuando el nuevo sitio está fuera de la circunferencia ficticia, el arco de parábola que debía desaparecer, señalado con una línea vertical correspondiente a p1, es tal que la situación de los arcos viene graficada según lo muestra la siguiente figura 2:

    Si calcula la abscisa de la intersección entre los extremos de p3 p1 p2, es decir <p3,p2>, la ordenada de dicha intersección está más abajo que la ordenada del arco de parábola p1calculada en dicha abscisa.

    Ese será el dato que se necesita para eliminar p1.

    Es interesante anotar que la abscisa de la intersección puede calcularse sin utilizar raíz cuadrada (sqrt).

    Este es un ejemplo genérico, puede verse la misma situación en cualquier momento en que procesa los sitios de la cola, no sólo con los cuatro primeros sitios:

    Los arcos que deben desaparecer, lo que era notorio en los eventos de círculo, ahora salen a la luz cuando están por encima de intersecciones.

    Si un sitio nuevo cae dentro de una circunferencia, se eliminan la falsa alarma.

    Si está fuera de la circunferencia:

    • Es posible que esté por encima de la ficticia línea horizontal donde estaría el evento de círculo -ahora inexistente-, en cuyo caso debe tratarse como un sitio más.

    • Es posible que esté debajo de dicha línea ficticia, en cuyo caso, dado que los sitios se trabajan en orden, la circunferencia define un vértice (eso se puede reconocer según lo dicho con ayuda de la Figura 2); entonces se define el vértice, desaparecen arcos y luego se trata el sitio como antes.

    Debido a que no hay eventos de círculo, pueden existir iteraciones.

     

    Métodos

    Además de recurrir a la recopilación documental y su selección, principalmente se ha utilizado el método analítico deductivo y, dentro de él, esquemas usuales de demostración, técnicas de diseño de algoritmos, en particular los de barrido, así como técnicas de análisis de algoritmos, en particular los que conciernen a la complejidad temporal.

     

    Resultados

    El principal resultado es la construcción de la variante del algoritmo de Fortune sin eventos de círculo. Se muestra completo en la página siguiente.

    En el Anexo se presenta un ejemplo de ejecución de la variante, mismo que termina de clarificar algunas partes.

     

    Discusión

    La variante presentada sigue perteneciendo a la clase de algoritmos de barrido y, al estar basado en el algoritmo de Fortune su complejidad temporal es 0(n log n).

    Aunque ya no hay eventos de círculo, los arcos se añaden a la línea de playa o desaparecen de él iterativamente, en las estructuras "Mientras" del algoritmo.

     

    Conclusiones

    Se ha mostrado que con la ayuda de la primitiva InCircle explícitamente utilizada, puede construirse una alternativa de presentación del algoritmo de Fortune popularizado por (Guibas L. J., Stolfi J., 1989).

    A diferencia de dicho estándar, la alternativa que se presenta no tiene eventos de círculo.

    El ejemplo de ejecución (que puede verse en el Anexo) muestra operativamente la teoría de base y el algoritmo propiamente dicho en acción.

    Tener una variante de cualquier algoritmo es muy común en Ciencias de la Computación, y pueden buscarse ventajas y beneficios de ella.

     

    Agradecimientos

    Un agradecimiento especial a los estudiantes que colaboraron temporalmente con este trabajo: Rodrigo Castillo, Gauss Carvajal, Fernando Tórrez, Leonardo Ríos y Adrián Fernández.

     

    Referencias

    De Berg, M., Van Kreveld, M., Overmars M., Scwarzkopf, O. (1997). "Computational geometry ". Springer.        [ Links ]

    Fortune, S. (1987). "A Sweep Une Algorithm for Voronoi Diagrams", Algorithmic, pp. 153-174.        [ Links ]

    Gravesen, J. (2012). "Guide to Computational Geometry Processing". Springer.        [ Links ]

    Guibas, L. J, Stolfi J. (1989). "Ruler, Compass, and Computer: The Design and Analysis of. Geometric Algorithms". En "Theoretical Foundations of Comput. Graph. and CAD", Vol. 40, pp. 111-165. Springer.        [ Links ]

    O'Rourke, C. J. (1994). "Computational geometry". Cambridge University Press.        [ Links ]

     

    ANEXO

    Para el primer y segundo sitios se coloca p1 p2 p1 en la linea de playa. Se añade la arista p1-p2 a D.

    Para cada siguiente sitio nuevo pk en la cola de prioridad Q:

    Sea p1 el sitio cortado por pk. Vemos si el arco cortado, su predecesor o su sucesor tienen un indicador de centro de tripleta convergente. Para cada uno de ellos:

    1)   Mientras el predecesor del arco cortado tiene indicador de tripleta

    AND

    el nuevo sitio est á fuera de la circunferencia definida por los tres sitios

    AND

    la ordenada de la intersección de las parábolas de los costados (tomándolos en el orden señalado en (*))

    es menor que (<) (en nuestro contexto está más abajo)

    la ordenada de la parábola del predecesor considerado evaluada en la abscisa de dicha intersección :

    La tripleta define un vértice: insertar vértice. Añadir arista con los extremos de la tripleta. Eliminar el sitio (arco) central a de la tripleta En la nueva linea de playa,
    verificar tripletas involucradas con el sitio eliminado, llamémoslo pj:

    Si predecesor de pj tomado como centro de tripleta converge: añadir indicador Si sucesor de pj tomado como centro de tripleta converge: añadir indicador

    Fin-Mientras

    Si el predecesor del arco cortado tiene indicador de tripleta

    AND

    el nuevo sitio está dentro de la circunferencia definida por la tripleta:

    borrar indicador (falsa alarma)

    2)   Mientras el sucesor del arco cortado tiene indicador de tripleta

    AND

    el nuevo sitio está fuera de la circunferencia definida por los tres sitios

    AND

    la ordenada de la intersección de las parábolas de los costados (tomándolos en el orden señalado en (*))

    es menor que (<) (en nuestro contexto está más abajo)

    la ordenada de la parábola del predecesor considerado evaluada en la abscisa de dicha intersección :

    La tripleta define un vértice: insertar vértice. Añadir arista con los extremos de la tripleta. Eliminar el sitio (arco) central a de la tripleta En la nueva linea de playa,

    verificar tripletas involucradas con el sitioeliminado, llamémosmlo pj:

    Si predecesor de pj tomado como centro de tripleta converge: añadir indicador

    Si sucesor de pj tomado como centro de tripleta converge: añadir indicador

    Fin-Mientras

    Si el sucesor del arco cortado tiene indicador de tripleta

    AND

    el nuevo sitio está dentro de la circunferencia definida por la tripleta:

    borrar indicador (falsa alarma)

    3) Si el arco cortado tiene indicador de tripleta:

    Si el nuevo sitio está dentro de la circunferencia definida por los tres sitios correspondientes a la tripleta: borrar indicador (falsa alarma).

    Insertar arista pk-pi.

    Insertar pk que (corta pi) en la linea de playa.

    Verificar tripletas (pk el más izquierdo/derecho): si converge añadir indicador.

    Terminación: (ya acabamos con todos los sitios pk, cola de prioridad Q vacia) Es posible que la linea de playa contenga sitios con indicador de tripleta:

    Mientras haya sitios con indicador de tripleta
    La tripleta define un vértice, añadirlo.
    Añadir arista con los extremos de la tripleta.
    Eliminar el sitio (arco) central α
    En la nueva linea de playa,

    verificar tripletas involucradas con el sitioeliminado, llamémosmlo pj:
    Si predecesor de pj tomado como centro de tripleta converge: añadir indicador

    Si sucesor de pj tomado como centro de tripleta converge: añadir indicador
    Fin-Mientras

    EJEMPLO DE EJECUCIÓN DE LA VARIANTE

    Terminación:

    La cola está vacía pero la línea de playa contiene sitios con indicador de tripleta.

    LP = p1 p4 p6 p4 p7 p4 p3 p5 p3 p1

    Insertar vértice y arista-extremos para p1 p4 p6:

    D = p1-p2 p2-p3 p2-p4 p3-p1 p3-p5 p1-p4 p4-p3 p4-p6 p4-p7 p1-p6 pc321 pc124 pc423 pc146

    Eliminar arco central p4:

    LP =p6 p6 p4 p7 p4 p3 p5 p3 p1

    Verificar (en la nueva línea de playa) tripletas involucradas con el sitio eliminado p4:
    Su predecesor es p1: pnphayp1p6 no procede.
    Su sucesor es p6:p1p6p4 no converge.

    Insertar vértice y arista-extremos para p6 p4 p7:

    D = p1-p2 p2-p3 p2-p4 p3-p1 p3-p5 p1-p4 p4-p3 p4-p6 p4-p7 p1-p6 p6-p7 pc321 pc124 pc423 pc146 pc647

    Eliminar arco central p4:

    LP = p1p6p7p4p3 p5p3p1

    Verificar (en la nueva línea de playa) tripletas involucradas con el sitio eliminado p4:
    Su predecesor es p6: p1p6p7 no converge.
    Su sucesor es p7: p6p7p4 no converge.

    Insertar vértice y arista-extremos para p7p4p3:

    D = p1-p2 p2-p3 p2-p4 p3-p1 p3-p5 p1-p4 p4-p3 p4-p6 p4-p7 p1-p6 p6-p7 p7-p3
    pc321 pc124 pc423 pc146 pc647
    pc743

    Eliminar arco central p4:

    LP = p1p6p7p3 p5p3p1

    Verificar (en la nueva línea de playa) tripletas involucradas con el sitio eliminado p4:

    Su predecesor es p7: p6p7p3 no converge.
    Su sucesor es p3: p7p3p5 converge, añadir indicador de tripleta.

    LP = p1p6p7p3 p5p3p1

    Insertar vértice y arista-extremos para p7p3p5:

    D = p1-p2 p2-p3 p2-p4 p3-p1 p3-p5 p1-p4 p4-p3 p4-p6 p4-p7 p1-p6 p6-p7 p7-p3 p7-p5
    pc321 pc124 pc423 pc146 pc647
    pc743 pc735

    Eliminar arco central p3:

    LP = p1p6p7p5p3p1

    Verificar (en la nueva línea de playa) tripletas involucradas con el sitio eliminado p4:
    Su predecesor es p7: p6p7p5 no converge.
    Su sucesor es p5: p7p5p3 no converge.

    Insertar vértice y arista-extremos para p5p3p1:

    D = p1-p2 p2-p3 p2-p4 p3-p1 p3-p5 p1-p4 p4-p3 p4-p6 p4-p7 p1-p6 p6-p7 p7-p3 p7-p5 p5-p1
    pc321 pc124 pc423 pc146 pc647
    pc743 pc735 pc531

    Eliminar arco central p3:

    LP = p1p6p7p5p1

    Verificar (en la nueva línea de playa) tripletas involucradas con el sitio eliminado p4:

    Su predecesor es p5: p7p5p1 no converge.

    Su sucesor es p1: pspipnohay no procede.

    Hemos finalizado. El diagrama de Voronoi para el ejemplo es este:

    D = p1-p2 p2-p3 p2-p4 p3-p1 p3-p5 p1-p4 p4-p3 p4-p6 p4-p7 p1-p6 p6-p7 p7-p3 p7-p5 p5-p1
    pc321 pc124 pc423 pc146 pc647 pc743 pc735 pc531

    Podría verse así, algunas aristas y vértices presentes en D se señalan con flechas torpemente dibujadas: