Geometría Computacional. Dr. Antonio Marín Hernández

Documentos relacionados
Geometría Computacional. Dr. Antonio Marín Hernández

Superposición de Mapas

Intersección de Segmentos de Recta. Geometría Computacional, MAT-125

Intersección entre segmentos de recta. comp-420

Descomposicion en Polígonos Monótonos. comp-420

Estructuras de datos geométricas

Intersección de Segmentos de Recta (2) Geometría Computacional, MAT-125

Computación Geométrica Descomposición en polígonos monótonos

Introducción Aplicaciones Primer Algoritmo Segundo Algoritmo - Algoritmo de Fortune. Diagrama de Voronoi. Jose Luis Bravo Trinidad 1 / 29

Introducción a la Geometría Computacional. Análisis de Algoritmos

Computación Geométrica Tema 5: Triangulación de polígonos. Triangulación por descomposición. Descomposición en polígonos monótonos.

Localización de puntos en el plano

Triangulación de polígonos

Computación Geométrica Intersección de segmentos

Modelación de objetos 3D Parte I: Mallas de polígonos y triangulaciones

Razonamiento Geométrico Tema 5: Triangulación de polígonos. Sesión 10: Descomposición en polígonos monótonos

Estructura de Datos Espaciales. por José Antonio Navarrete Pacheco INTRODUCCIÓN

Escuela Técnica Superior. de Ingeniería Informática. Curso 2015/2016. Boletín de Problemas. Geometría Computacional. Dpto. de Matemática Aplicada I

Razonamiento Geométrico Tema 5: Triangulación de polígonos. Sesión 9: Algoritmos iniciales

Arreglos y Dualidad. Giomara Lárraga, Sotero Martínez. 19 de marzo del CINVESTAV-Tamaulipas

Triangulación de Polígonos. comp-420

Matemáticas Discretas L. Enrique Sucar INAOE. Teoría de Grafos. Problema de los puentes de Königsberg [Euler]

Estructuras Dinámicas de datos.

Relleno de Polígonos 1

Estructura de Datos Unidad 6: ARBOLES

Intersección de semiplanos

Politopos y cubiertas convexas en 3 o más dimensiones

Triangulación de Polígonos: Problema de la Galería de Arte. Geometría Computacional, MAT-125

Árboles de Partición Quadtrees Octrees K-d trees

Sesión 4: Teoría de Grafos

Intersección de segmentos de línea

Curso SIG. Curso SIG Conceptos Básicos y Funciones. Conceptos Básicos y Funciones. Representaciones del mundo. Curso SIG - Pablo Rebufello 1

Estructura de Datos. Estructuras de Datos no lineales : Árboles

UNIDAD 2. Constructiva). CSG se define como la representación de un objeto mediante un árbol

Programación TADs Colecciones Conjuntos, Diccionarios y Tablas

Algoritmos de Visibilidad

Árboles de Partición Quadtrees Octrees K-d trees

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

Diagramas de Voronoi

UNIDAD Creación del Árbol Octal de un objeto sólido vía la definición CSG

UNIDAD 9. DATOS COMPLEJOS PILAS

Algoritmos de fuerza bruta

1 Representación por superficies de polígonos

Definición 1: Un grafo G es una terna ordenada (V(G), E(G), Ψ

Tema 6. Tema 6. Tema 6. Modelado 3D 6.1 Introducción 6.2 Modelado plano de superficies 6.3 modelado de sólidos. 6.1 Introducción

Árboles B y B ) 20. Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 63

ÁRBOLES CRISTIAN ALFREDO MUÑOZ ÁLVAREZ JUAN DAVID LONDOÑO CASTRO JUAN PABLO CHACÓN PEÑA EDUARDO GONZALES

Algoritmos Geométricos. Héctor Navarro. UCV

Estructuras de Datos y Algoritmos: Boletín de Problemas del segundo parcial

Envolvente Convexo. comp-420

Apellidos:... Nombre:...

Examen de Estructuras de Datos y Algoritmos. (Modelo 2)

Examen de Estructuras de Datos y Algoritmos. (Modelo 1)

Diagramas de Voronoi. comp-420

Matemáticas Básicas para Computación

Francisco J. Hernández López

Definiciones y ejemplos.

A) PREORDEN B) INORDEN C) POSTORDEN D) NIVELES

ESTRUCTURA DE DATOS. ABB Arboles de Búsqueda Binaria

Descubrir los árboles como paradigma de los tipos Recursivos de Datos

Algoritmos voraces (greedy)

Profesor: José Miguel Rubio L.

Estructuras de datos en SIG

Capítulo II Sistemas de Modelado Geométrico

Organización y acceso a los datos (continuación)

Lógica: Algoritmo: Archivo: Base de datos: Bit:

Diagrama de Voronoi. Ejemplo de problemas geométricos:

Capítulo 8. Árboles. Continuar

Estructuras de datos: Árboles binarios de

Estructuras de Datos y Algoritmos

Modelamiento Geométrico

CAPÍTULO 1. Rectas y ángulos

Estructuras de datos Listas y árboles

Gráficas. Las relaciones que resultan de estas conexiones nos llevan a preguntas como:

Propuesta sobre Relaciones Geométricas y Topológicas para el SIG del COSIPLAN. Viviana Alarcón Muñoz - Geógrafa Ministerio de Obras Públicas - Chile

Análisis y Complejidad de Algoritmos. Arboles Binarios. Arturo Díaz Pérez

Rellenado de rectángulos y polígonos

Guía N 1 Introducción a las Matemáticas

Preguntas básicas de geometría computacional. comp-420

ANEXO C: ALGORITMOS DE INTERSECCIÓN

Árboles. Un grafo no dirigido es un árbol si y sólo si existe una ruta unica simple entre cualquiera dos de sus vértices.

CAPÍTULO 2. ÁRBOLES 2.0. CONCEPTOS GENERALES

95.12 Algoritmos y Programación II Práctica 7: árboles

Modelado de Objetos 3D II

Cubiertas convexas. Dr. Eduardo A. RODRÍGUEZ TELLO. 18 de enero del CINVESTAV-Tamaulipas

Un árbol binario T se define como un conjunto finito de elementos, llamados nodos, de forma que:

Eduardo Mosqueira Rey Bertha Guijarro Berdiñas Mariano Cabrero Canosa

Acerca del interior de un polígono

Fútbol, geometría y otros problemas.

Detección de Colisiones. Héctor Navarro

Estructuras de Datos II

TEMA 5 El tipo grafo. Tipo grafo

Descriptores de Forma

Triangulaciones de Delaunay

Robots Autónomos Miguel Cazorla,, Otto Colomina Depto.. Ciencia de la Computación n e I.A. Universidad de Alicante

Tablas de dispersión

Transcripción:

Geometría Computacional Dr. Antonio Marín Hernández Centro de Investigación de Inteligencia Artificial Universidad Veracruzana anmarin@uv.mx www.uv.mx/anmarin Contenido Introducción Triangulación de polígonos Diagramas de Voronoi Triangulación de Delaunay Envolventes Convexos Visibilidad Medidas de forma

Los mapas son una fuente invaluable de información. Atracciones turísticas, caminos, vías, lagos, etc. Sin embargo, en ocasiones resulta difícil encontrar la información deseada. Los mapas generalmente están separados en varias capas. Cada capa tiene diferentes tipos de información. Esta información puede también incluir cosas como la densidad de población, promedio de precipitación, hábitat de una especie animal o vegetal, etc. Esta información se almacena de maneras diferentes: puntos ciudades, líneas o curvas - caminos, regiones vegetación.

Como usuario de un GIS, se puede estar interesado en encontrar ciudades, y no ser distraido por los nombres de los ríos. Una vez encontrada una ciudad, se podría desear saber como llegar a esta. Cuando dos mapas con temáticas diferentes se sobreponen, resulta interesante saber donde se encuentran las intersecciones de estos. Si son líneas estas intersecciones serán puntos, y si son regiones, serán subregiones Nos interesaremos inicialmente en el problema de mapas que son redes representadas como colecciones de segmentos de. Necesitamos saber, dados dos mapas, todas las intersecciones entre un segmento de uno y un segmento del otro. El problema aun no esta especificado del todo, ya que no hemos definido cuando dos segmentos se intersectan.

Comúnmente, los caminos y ríos son representados por cadenas de segmentos. Por lo tanto, el cruce de un camino sobre un río, se presenta cuando el interior de una cadena intersecta el interior de la otra. Considerar los segmentos cerrados. Una manera de simplificar la descripción es poner todos los segmentos en un solo conjunto y así calcular las intersecciones entre todos los segmentos del conjunto. Dado un conjunto S de n segmentos cerrados en el plano, encontrar todos los puntos de intersección entre los segmentos de S

Un algoritmo de fuerza bruta tomaría O(n 2 ) La mayoría de los segmentos intersecta solo unos cuantos o ningún segmento. El número de intersecciones es mucho menor que el cuadrático. Sería deseable tener un algoritmo que no solo depende del número de segmentos sino del número de intersecciones Output-sensitive algorithm Cómo se puede evitar verificar todos los pares de segmentos? Para esto se necesita hacer uso de la geometría de la situación. Segmentos cercanos son mejores candidatos que los segmentos lejanos.

Output-sensitive algorithm Sea S:={s 1, s 2,,s n } un conjunto de segmentos para el cual se quiere calcular todas las intersecciones Queremos evitar verificar intersecciones de segmentos alejados. Definamos el intervalo y de un segmento como su proyección ortogonal sobre el eje y. Podemos decir que cuando dos intervalos y de dos diferentes segmentos no se sobreponen, estos no se intersectan. Por lo tanto solo necesitamos verificar los pares de segmentos que se sobrepongan, esto es que exista una línea horizontal que intersecte a ambos segmentos.

y x Para encontrar los pares de líneas que se intersectan: Imaginemos una línea l la cual desciende sobre el plano, comenzando en una posición por encima de los segmentos. Mientras esta línea se desliza, podemos almacenar todos los segmentos que la intersectan.

l Este tipo de algoritmo se llama de barrido del plano y la línea l es llamada línea de barrido. El estado de la línea l es el conjunto de segmentos que la intersectan. El estado cambia conforme l desciende, pero no de manera continua. Solo en algunos puntos particulares el estado cambia, llamados puntos evento

l Punto evento Es cuando la línea de barrido alcanza un punto evento que el algoritmo realmente hará algo. Se actualiza el estado de l y se realizan algunas pruebas de intersección. En particular si el punto evento es el punto superior de un segmento, entonces una nueva línea comienza a intersectar a l y debe ser añadida al estado. Se prueban las intersecciones de este segmento con los otros en el estado de l. Si el punto evento es un punto final, el segmento es borrado.

De esta manera solo probaremos intersecciones entre segmentos para los cuales exista una línea horizontal que los intersecte. Desafortunadamente, no es suficiente. Aún se presentarán situaciones en las cuales la verificación sea cuadrática cuando solo haya unas pocas intersecciones Conjunto de segmentos verticales que intersectan el eje X El algortimo no es sensible a la salida El problema es que dos segmentos que intersecten a l pueden aun estar muy lejanos en la dirección horizontal. Ordenemos los segmentos de izquierda a derecha conforme ellos intersectan la línea de barrido. Solo probaremos los segmentos que sean adyacentes en el orden horizontal. Cada nuevo segmento se verificará con respecto a dos segmentos inmediatos, a la izquierda y a la derecha.

Conforme la línea de barrido se mueva el segmento podrá ser adjacente a otros segmentos. Esto se reflejará en el estado de nuestro algoritmo, dado que ahora tendremos una secuencia ordenada de segmentos que intersectan a l. El nuevo estado no solo cambia en los límites de los segmentos sino también cuando existan intersecciones, cuando el orden de los segmentos intersectados cambia. l

Hemos reducido el número de pares a verificar. Encontraremos todas las intersecciones? En otras palabras dados dos segmentos que se intersectan s i y s j, Existirá siempre una posición de la línea de barrido l en donde s i y s j sean adyacentes? l s i s j

Ignoremos inicialmente algunos casos: No hay segmentos horizontales. Los segmentos solo se intersectan en un solo punto. No existen más de dos segmentos que se intersecten en el mismo punto. Las intersecciones en las cuales un punto extremo de un segmento cae sobre otro son facilmente detectables. Serán detectadas todas las intersecciones interiores? Lema: Sea s i y s j dos segmentos no horizontales cuyos interiores se intersectan en un punto p, asúmase que no hay un tercer segmento que pase por p. Entonces existe un punto evento arriba de p en donde s i y s j se hacen adyacentes y entonces verificados para intersección.

Prueba: Sea l una línea horizontal ligeramente arriba de p. Si l es suficientemente cercana a p entonces s i y s j deben ser adyacentes a lo largo de l. En otras palabras, existe una posición de la línea de barrido en donde s i y s j son adyacentes. Inicialmente s i y s j no son adyacentes ya que el estado de l es vacío. Por lo tanto debe existir un punto q donde s i y s j se hagan adyacentes y por lo tanto probadas para intersección. l s i s k s j

Línea horizontal de barrido l desciendo en el plano, El estado de la línea de barrido cambia en ciertos puntos evento. Los puntos extremos de los segmentos, conocidos previamente Los puntos de intersección calculados al vuelo. Conforme la l se mueve mantiene una secuencia ordenada de segmentos que la intersectan. Cuando l intersecta un punto evento la secuencia de segmentos cambia, lo cual depende del tipo de evento.

l s i s k s j Degeneraciones Tres o más segmentos se intersectan en un mismo punto. ES IMPORTANTE DEFINIR QUE SE QUIERE DEL ALGORITMO Reportar cada punto de intersección una solo vez. La lista de segmentos que ahí se intersectan o que son puntos extremos. Los casos de segmentos sobrepuestos serán ignorados

Estructura de datos que usa el algoritmo Se necesita una estructura de datos que almacene los eventos, esta es llamada cola de eventos, denotada por Q. Necesitamos una operación que remueva el siguiente evento que ocurrirá en Q y que lo devuelva para ser tratado. Este evento será el más alto evento debajo de la línea de barrido l. Si dos eventos tienen la misma coordenada y, entonces el que tenga la menor coordenada x será regresado (puntos evento en la misma línea horizontal serán tratados de izquierda a derecha). Esto implica que debemos considerar el extremo derecho de un segmento horizontal como el extremo superior y el izquierdo como el extremo inferior.

Es importante notar que los puntos evento pueden coincidir. Dos puntos extremos superiores de diferentes segmentos. l

Implementación de la cola Q. Defínase un operador de orden para los puntos evento, el cual representa el orden en el cual serán manejados. Si p y q son dos puntos evento se tendrá que: p q sí y solo sí, p y > p q ó p y = p q y p x < q x. Almacenaremos los puntos evento con respecto al operador. Implementación de la cola Q. Para cada punto evento p en Q almacenaremos los segmentos que inician en p. La recuperación del siguiente evento, así como de la inserción de un evento toman un tiempo O(log m), donde m es el número de eventos en Q

Se necesita mantener el estado del algoritmo. Esto es la secuencia ordenada de segmentos que intersectan la línea de barrido. El estado, que denotaremos por τ, es usado para acceder a los vecinos de un segmento dado s, de manera que puedan ser verificadas sus intersecciones. La estructura del estado debe ser dinámica, conforme los segmentos comiencen o dejen de intersectar la línea de barrido deben ser añadidos o borrados de esta. Ya que se cuenta con un orden bien definido de los segmentos en la estructura estado, se puede usar un árbol binario balanceado.

Más detalladamente, se almacenan los segmentos ordenados que intersectan la línea de barrido en las hojas del árbol. El orden de izquierda a derecha de los segmentos a lo largo de la línea de barrido corresponde al orden de izquierda a derecha de las hojas del árbol. Se debe añadir información en los nodos internos de manera a guiar la búsqueda En cada nodo interno, almacenaremos el segmento más a la derecha del subárbol de la izquierda. Alternativamente se puede almacenar los segmentos solo en los nodos interiores, ahorrando así espacio. Sin embargo, es más fácil pensar en los segmentos en los nodos interiores como guía para la búsqueda que como datos.

τ s k s i s l s j s i s j s k s l s m s i s j s k s l s m l Supongamos que buscamos en τ el segmento inmediato a la izquierda de algún punto p sobre la línea de barrido. Para cada nodo interno v, verificamos si p cae a la izquierda o a la derecha del segmento almacenado en v. Dependiendo de la respuesta, descendemos a la izquierda o a la derecha al siguiente subárbol y eventualmente hasta la hoja.

La hoja inmediata a la izquierda es el segmento que buscamos. Similarmente se hace para el segmento a la derecha o segmentos que contengan a p. τ s k s i s l s j s i s j s k s l s m s i s j s k s l s m l

FindIntersections(S) 1. Inicializar la cola vacía Q e insertar los extremos de los segmentos en Q. cuando un punto extremo superior es insertado también lo es el segmento. 2. Inicializar la estructura vacía τ 3. Mientras Q no este vacía 4. Determinar el siguiente punto evento p en Q y borrarlo. 5. Procesar el punto evento p. Lista de bordes doblemente conectados Mapas divididos en subregiones Representación de esa subdivisión. No se puede hacer solo con segmentos. Se necesita incluir información sobre la estructura y la topología. Que segmentos limitan a que región Cuales regiones son adyacentes Etc.

Consideraremos que los mapas son subdivisiones planas inducidas por un grafo. Estas subdivisiones estarán conectadas sí el grafo lo esta. Un nodo será un vértice y un arco será un borde. Una faceta o cara es el subconjunto máximo conectado del plano que no contiene ningún punto en un borde o vértice. Una cara es una región abierta poligonal cuyo perímetro está formado por los bordes y vértices de la subdivisión. La complejidad de la subdivisión está definida como la suma del número de vértices, el número de bordes y el número de caras de las cuales consiste. Si un vértice es un extremo de un borde, entonces se dice que el vértice y el borde son incidentes. Similarmente una cara y un borde en el perímetro son incidentes; y una cara y un vértice.

Qué se puede requerir de una representación de una subdivisión? Determinar si un punto está contenido en una cara. Será posible recorrer el perímetro de una cara dada? Se puede llegar a una cara desde otra adyacente si tenemos un borde común? Se pueden visitar todos los bordes alrededor de un vértice dado? Lista de bordes doblemente conectada Un lista de bordes doblemente conectada contiene un registro de cada cara, borde y vértice de la subdivisión. Si se representa un mapa de vegetación, entonces cada cara almacenará el tipo de vegetación de la región correspondiente. Esta información adicional es llamada información atributo.

La información geométrica y topológica almacenada nos permitirá hacer las operaciones básicas mencionadas. Para poder recorrer una cara en sentido de las manecillas del reloj, se debe almacenar un apuntador de cada borde al siguiente. Como se puede recorrer en el otro sentido será necesario también incluir un apuntador al borde anterior. Un borde comúnmente limita dos caras, por lo tanto se necesitan dos apuntadores para ello. Es conveniente ver los diferentes lados de un borde como dos distintos medios bordes (halfedges). De esta manera solo tendremos un medio borde siguiente o anterior para cada medio borde. Esto significa que un medio borde delimita solo una cara. Los dos medios bordes obtenidos para un borde se les llama gemelos.

Definir el siguiente medio borde de un medio borde dado con respecto a un recorrido de una cara en sentido contrario a las manecillas del reloj, induce una orientación de cada medio borde. Estos son orientados de manera que la cara que limitan esta a la izquierda para un observador que recorre el borde Podemos entonces hablar de origen y destino de un medio borde. Si un borde e, tiene como origen v y como destino w, entonces su gemelo Twin(e) tiene a w como su origen y a v como destino.

v e w Sin embargo para agujeros en la cara no se cumple que al recorrerlos en sentido contrario al de las manecillas del reloj la cara este del lado izquierdo. Por lo tanto es conveniente orientar los medios bordes de manera que la cara siempre este del mismo lado.

La presencia de agujeros en la cara, implica que un solo apuntador a un medio borde arbitrario no es suficiente para recorrer sus limites. Se necesita un apuntador a un medio borde para cada agujero. Bordes aislados serán ignorados.

Se requieren tres registros: Vértices: El registro de un vértice v almacena las coordenadas de v y un apuntador a un medio borde arbitrario que tiene a v como origen. Caras: De una cara f se almacena un apuntador a algún medio borde de sus límites exterior (caras no limitadas es igual a nil). Y también una lista de componentes internos que contiene para cada agujero, un apuntador a un medio borde. El registro de los medios bordes e, almacena: Un apuntador a su origen, uno a su gemelo y un apuntador a su cara incidente. No se requiere almacenar el destino de un borde porque es igual al origen del gemelo. También se almacenan apuntadores al siguiente y anterior medios bordes de la cara incidente.

IncidentFace(e) Prev(e) Next(e) Origin(e) e Twin(e) Se requiere una cantidad constante de memoria para cada vértice y borde. Sin embargo, para cada cara se requiere almacenar al menos un apuntador a cada uno de los componentes internos. Podemos considerar que el promedio de almacenamiento es lineal con respecto a la complejidad de la subdivisión.

v 1 e 1 v 2 e 3 e 4 v 3 v 4 e 2 Vertex Coordinates IncidentEdge v 1 (v 1x,v 1y ) e 1,1 v 2 (v 2x,v 2y ) e 4,2 v 3 (v 3x,v 3y ) e 2,1 v 4 (v 4x,v 4y ) e 2,2

v 1 e 1,1 v 2 e 1,2 e 3,2 e 4,1 e 3,1 e 4,2 e 2,2 v 3 v 4 e 2,1 Face OuterComponent InnerComponents f 1 nil e 1,1 f 2 e 4,1 nil

v 1 e 1,1 v 2 e 1,2 f 1 e 3,2 f 2 e 4,1 e 3,1 e 4,2 e 2,2 v 3 v 4 e 2,1 Half-edge Origin Twin IncidentFace Next Prev e 1,1 v 1 e 1,2 f 1 e 4,2 e 3,1 e 1,2 v 2 e 1,1 f 2 e 3,2 e 4,1 e 2,1 v 3 e 2,2 f 1 e 2,2 e 4,2 e 2,2 v 4 e 2,1 f 1 e 3,1 e 2,1 e 3,1 v 3 e 3,2 f 1 e 1,1 e 2,2 e 3,2 v 1 e 3,1 f 2 e 4,1 e 1,2 e 4,1 v 3 e 4,2 f 2 e 1,2 e 3,2 e 4,2 v 2 e 4,1 f 1 e 2,1 e 1,1

v 1 e 1,1 v 2 f 2 e 1,2 f 1 e 3,2 e 4,1 e 3,1 e 4,2 e 2,2 v 3 v 4 e 2,1 Tenemos una buena representación de una subdivisión. Se define la sobreposición de dos subdivisiones S 1 y S 2 como la subdivisión O(S 1,S 2 ) tal que haya una cara f en O(S 1,S 2 ), sí y solo sí, hay caras f 1 en S 1 y f 2 en S 2, tales que f es un subconjunto máximo conectado de f 1 f 2.

S 1 S 2

El problema general de la sobreposición de mapas es: dados las listas de segmentos doblemente conectadas S 1 y S 2 calcular una lista de segmentos doblemente conectados O(S 1,S 2 ). Se requiere que las caras de O(S 1,S 2 ) estén etiquetadas con las etiquetas de las caras en S 1 y S 2. Qué información podemos reutilizar de S 1 y S 2? Consideremos inicialmente la red de vértices y bordes de S 1. Esta red es cortada por los bordes de S 2. Estos trozos son ampliamente reutilizables. Solo los segmentos que han sido cortados por los segmentos de S 2 tienen que ser recalculados.

Se requerirá cambiar la información de los medios bordes? Solo se necesita cambiar la información de los bordes cruzados y los otros permanecerán iguales

Procedimiento Copiar las listas doblemente conectadas de S 1 y S 2 en una nueva. Este nueva lista no será una lista doblemente conectada valida. Esta es la tarea de nuestro algoritmo. Esto es: Calcular las intersecciones de las dos redes de segmentos y ligar las partes correspondientes El computo de las caras es más complejo y se verá posteriormente. Usaremos el algoritmo realizado previamente para la intersección de segmentos de. Se correrá este algoritmo para la unión de los dos conjuntos de segmentos. La diferencia ahora es que se tiene a Q, τ y ahora a D la cual es la lista doblemente conectada.

l Inicialmente D contiene la copia de S 1 y S 2, y durante el barrido se transformará D en una lista doblemente conectada válida. Los segmentos son considerados cerrados Los puntos de cruce se tendrán que añadir a la estructura D.

Qué se debe hacer cuando se llega a un punto evento? Primero, se actualiza τ y Q. Si la intersección involucra solo segmentos de alguna de las dos subdivisiones, no hay nada que hacer y el vértice puede ser reutilizado. Si el evento involucra bordes de ambas subdivisiones, se debe actualizar D para realizar la doble conexión de las subdivisiones originales. e v e e

Actualizar apuntadores Twin(), Prev(), Next() Situación del vértice v La mayoría de estos procesos toman un tiempo constante. El encontrar el orden cíclico de los medios bordes toma un tiempo lineal. Cruce de bordes O(m). En donde m es el número de bordes incidentes en el punto evento.

Nos queda calcular las caras de O(S 1,S 2 ). Se necesita crear un registro para cada f en O(S 1,S 2 ). InnerComponents OuterComponents Etiquetas para cada cara. Excepto para la cara no limitada, todas las otras tienen un límite exterior. El número de caras es igual al número de límites exteriores más uno. Cómo saber si un ciclo es interior o exterior? Verificar el vértice más a la izquierda del ciclo (o en algunos casos el más debajo de los más a la izquierda). Recordemos que los medios bordes están dirigidos y que las caras están a la izquierda de estos.

Consideremos los dos segmentos incidentes en el vértice v. Calculeemos el ángulo entre los dos segmentos (medios bordes). Sí este ángulo es menor que 180 el ciclo es exterior, sino es un interior (agujero). Esto es válido para el vértice más a la izquierda del ciclo, más no para los otros vértices.

Para determinar que ciclos limitan a que cara se construye un grafo G. Para cada ciclo hay un nodo en G. Hay un nodo para el ciclo imaginario de la cara no delimitada. Existe un arco entre dos nodos, sí y solo sí, un nodo es un ciclo de agujero y el otro tiene un medio borde inmediatamente a la izquierda del vértice más a la izquierda del agujero. Si no hay tal medio borde, entonces el agujero se liga al nodo de la cara no delimitada.

C 3 C 5 C 6 C 4 C 7 C C 1 C 2 C 1 C C 3 C 2 C 6 C 7 C 4 C 5 Geometría Computacional Dr. Antonio Marín Hernández Centro de Investigación en Inteligencia Artificial Universidad Veracruzana anmarin@uv.mx www.uv.mx/anmarin