Computational Geometry - 1 · 2016-09-14 · • Con esto podemos generar una nueva definición...
Transcript of Computational Geometry - 1 · 2016-09-14 · • Con esto podemos generar una nueva definición...
Dr. Antonio Marín Hernández
Centro de Investigación en Inteligencia Artificial Universidad Veracruzana
[email protected] www.uv.mx/anmarin
Geometría Computacional
• Introducción • Intersección de segmentos de rectas • Triangulación de polígonos • Diagramas de Voronoi • Triangulación de Delaunay • Envolventes Convexos • Visibilidad • Medidas de forma • …
Contenido
• Requieren ir al baño urgentemente en un parque de diversiones
• ¿Cuál es el baño más cercano? • Si, se tiene un mapa, se podría localizar el
baño más cercano.
Introducción
• Sería bueno sí, dicho mapa se muestra como una subdivisión del parque en regiones para las cuales estuviera indicado el baño más cercano a cada región.
• ¿Cómo deberían ser estas regiones? • ¿Cómo se calculan?
Introducción
• Este mapa se puede describir con un concepto fundamental de la geometría
• El diagrama de Voronoi.
Introducción
• Los diagramas de Voronoi, pueden ser usados para: – Modelar áres de comercio en ciudades, – Para guiar robots – Para describir y simular el crecimiento de
cristales – Etc.
Introducción
• Calcular un estructura geométrica como el diagrama de Voronoi requiere de algoritmos de geometría computacional
Introducción
• Suponga que, ha localizado el baño más cercano
• Con ayuda del mapa se puede encontrar la ruta más cercana, sin tener que pasar por encima de jardineras, muros, etc.
• Programar un robot que haga lo mismo no es una tarea nada fácil
Introducción
• Nuevamente, el problema es puramente geométrico.
• Dada una colección de obstáculos geométricos, se requiere encontrar la conexión más corta entre dos puntos, evitando colisiones
• Solucionar este problema se llama Planificación de movimientos
Introducción
Introducción
• Tercer ejemplo: Suponga que no tiene un mapa sino dos.
• Uno incluyendo la descripción de las atracciones y edificios del parque, incluyendo los baños; y otro que incluye los caminos del parque.
• Planificar los movimientos para llegar al baño, requiere la combinación de estos mapas.
Introducción
• Es decir, se tiene que combinar la información proveniente de dos mapas.
• Esta operación es básica en los sistemas de información geográfica (GIS)
• Esto implica localizar los objetos de un mapa en el otro, calcular las intersecciones de varias características, etc.
Introducción
• Estos tres ejemplos muestran problemas que requieren de algoritmos geométricos diseñados cuidadosamente.
• La geometría computacional emerge en los 70's para tratar con este tipo de problemas geométricos.
Introducción
• Podemos definir a la Geometría Computacional como el estudio sistemático de algoritmos y estructuras de datos para objetos geométricos enfocados a algoritmos exactos asintóticamente rápidos.
Introducción
• Los algoritmos de geometría computacional tienen un amplio rango de aplicaciones. – Robótica – Gráficas por computadora – CAD/CAM – GIS – etc.
Introducción
• El envolvente convexo (Convex Hull) • Las buenas soluciones a problemas
algorítmicos de naturaleza geométrica están mayormente basados en dos ingredientes: – Entendimiento de las propiedades
geométricas del problema – La aplicación correcta de las técnicas
algorítmicas y estructuras de datos
Introducción
• Si no entienden la geometría del problema, aun con todos los algoritmos del mundo no podrán resolver el problema eficientemente.
• Por otro lado, aun cuando se entienda la geometría del problema, es muy díficil resolverlo eficientemente sino se tienen las técnicas algorítmicas correctas
Introducción
• Comenzaremos estudiante uno de los primeros problemas estudiados por la geometría computacional
• El cálculo planar del envolvente convexo
Introducción
• Un subconjunto de S del plano es llamado convexo sí y solo sí, para cualquier par de puntos p,q ∈ S el segmento de línea pq esta completamente contenido en S.
• El envolvente convexo CH(S) de un conjunto S es el conjunto convexo más pequeño que contiene a S.
Introducción
• Para ser más precisos, es la intersección de todos los subconjuntos que contienen a S.
• Calcularemos el envolvente convexo para un conjunto finito P de n puntos en el plano
Introducción
• Podemos suponer que los n están puntos fijos en el plano y entonces se puede ajustar una banda elástica alrededor
• El área de la banda elástica será el envolvente convexo
Introducción
Introducción
• Con esto podemos generar una nueva definición para el envolvente convexo de un conjunto fínito de puntos en el plano
• Es el único polígono convexo cuyos vertices son puntos de P y estan contenidos todos los puntos de P
• Habría que probar rigurosamente que esta bien definido, es decir que el polígono es único
Introducción
• ¿Cómo se calcula el envolvente convexo? • ¿Qué siginifca calcular el envolvente
convexo? • Como se ha visto, el envolvente convexo
es un polígono convexo • Una manera natural de representar un
polígono es listando sus vertices en algún sentido (manecillas del reloj)
Introducción
• El problema que se quiere resolver es el siguiente: – Dado un conjunto P={p1,p2,..,pn} de puntos en
el plano, calcular la lista que contiene los puntos de P que son vertices del CH(P) listado en orden.
Introducción
p1 p5
p2 p3
p6 p9
p7
p8
p4
p4, p5, p6, p9, p7, p8
Introducción
• La primera definición no es de mucha ayuda para el diseño del algoritmo para calcular el envolvente convexo – Intersección de todos los conjuntos convexos
que contienen a P • La observación de que CH(P) es un
polígono convexo es más útil
Introducción
• Veamos ¿cuáles son los bordes de CH(P)?
• Ambos puntos finales p y q de un borde son puntos de P
• Si la dirigimos la línea a través de p y q tal que el CH(P) quede a la derecha, entonces todos los puntos de P deben estar a la derecha de esta línea.
Introducción
q
p
Introducción
• Al revés se cumple también • Si todos los puntos de P | {p,q} caen a la
derecha de la línea dirigida que pasa por p y q entonces el segmento pq es un borde del CH(P)
Introducción
• Algoritmo SLOWCONVEXHULL(P): • Entrada:
– Un conjunto P de puntos en el plano • Salida:
– Una lista L conteniendo los vertices de CH(P) en sentido de las manecillas del reloj
Introducción
• E = 0 • Para todos los pares ordenados (p,q) ∈ P x P con p ≠ q
– Hacer valid = true • Para todos los puntos r ∈ P r ≠ q y r ≠ q • sí r cae a la izquierda de la línea dirigida de p a q
entonces valid = false • Sí valid entonces añadir el borde dirigido pq a E • Para el conjunto de bordes construir la lista L de vertices
de CH(P) ordenados en favor de las manecillas del reloj
Introducción
• ¿Cómo probar sí un punto esta a la derecha o a la izquierda de un segmento dirigido de recta?
• ¿Cómo ordenar los segmentos de recta correspondientes al envolvente convexo?
R1: Cálculo del determinante R2: Ordenamiento considerando las
características de los segmentos (cada punto se repite dos veces, uno como inicio de un segmento y otra como fin de otro)
Introducción
• Ordenamiento de los segmentos en L O(n2) • Se puede mejorar O(n log n) Complejidad del método SlowConvexHull
– Se necesita verificar n2 - n pares de puntos – Para cada par se observan n - 2 puntos – O(n3) -> DEMASIADO LENTO
El problema radica en que solo se transcribió la geometría del problema en un algoritmo de fuerza bruta
Introducción
• Otras observaciones: – Poco cuidado al definir cuando un par de
puntos p y q definen un borde del CH(P) – Un punto puede estar sobre la línea que
definen estos dos puntos – Se le llama un caso degenerado o
degeneración – Aunque inicialmente ignorados, estas
situaciones se presentan con facilidad
Introducción
Algoritmo correcto en presencia de degeneraciones
• Un borde dirigido pq es un borde del CH(P), sí y solo sí, todos los puntos r ∈ P están estrictamente a la derecha de la línea dirigida que pasa a través de p y q, ó están en el segmento abierto pq – Asumimos que no hay puntos coincidentes
Introducción
Introducción
Puntos muy cercanos • Para tres puntos casi colineales, es
posible que por error de redondeo, para cada segmento de línea entre estos se encuentre que todos los puntos están a la derecha ó
• Que ninguno cumpla con esta situación.
Introducción
Introducción
• A pesar de que se probo que el algoritmo fuera correcto y que manejara los casos especiales, no es robusto.
• Pequeños errores en los cálculos pueden hacer que falle de maneras inesperadas
• El problema es que se asumió que los cálculos con números reales son exactos.
Introducción
Algoritmo incremental • Se añadirán los puntos en P de uno en uno,
actualizando la solución después de cada adición.
• Estos puntos se añadirán bajo un orden: de izquierda a derecha
• Por lo tanto será necesario ordenarlos inicialmente con respecto a su coordenada ‘x’, obteniéndose así la secuencia {p1,… ,pn}
Algoritmo incremental • Se calcularán inicialmente los bordes del
CH(P) en la parte superior, la cual va desde el punto más a la izquierda p1 hasta el punto más a la derecha pn (a favor de las manecillas del reloj)
• En segundo lugar se calculará la parte restante, la parte inferior.
Introducción
Introducción
Upper Hull
lower Hull
Algoritmo incremental • El paso principal en este algoritmo es la
actualización del envolvente superior cuando añadimos un nuevo punto pi.
• Es decir, dado el envolvente superior por p1,… ,pi-1, calcularlo ahora para p1,… ,pi.
Introducción
Algoritmo incremental • Al recorrer en sentido de las manecillas
del reloj el borde de un polígono cualquiera, cuando se llega a un vértice se realiza un giro (izquierda o derecha).
• Para un polígono convexo todos los giros serán a la derecha.
Introducción
Introducción
Algoritmo incremental • Sea Lupper la lista de vértices del envolvente superior en
orden de izquierda a derecha. • Inicialmente se agrega pi a Lupper. Ya que pi es el punto
más a la derecha de todos los incluidos. • Después, se verifica si los últimos tres puntos en Lupper
realizan un giro a la derecha. – Si es el caso se continua con – Sino, se borra el punto intermedio, y se verifica nuevamente si
los últimos tres puntos realizan una vuelta a la derecha, y se continua verificando hasta que los últimos tres puntos que hagan una vuelta a derecha o queden solo dos puntos.
Introducción
pi
Introducción
Algoritmo incremental • Ordenar los puntos por su coordenada x • Poner los puntos p1 y p2 en Lupper • Para i desde 3 y hasta n, hacer: • Agregar pi a Lupper • Mientras Lupper contenga más de
dos puntos y los último tres hagan no hagan un giro a la derecha hacer:
• Borrar el punto medio de los últimos tres puntos en Lupper
Introducción
Algoritmo incremental • Poner los puntos pn y pn-1 en la lista Llower. • Para i desde n - 2 y hasta 1, hacer: • Agregar pi a Llower • Mientras Llower contenga más de dos puntos y los
último tres hagan no hagan un giro a la derecha hacer:
• Borrar el punto medio de los últimos tres puntos en Llower
• Borrar los puntos pn y p1 de la lista Llower para evitar duplicados.
• Juntar las listas Lupper y Llower en L
Introducción
Algoritmo incremental • Nuevamente echando un vistazo podemos darnos
cuenta de que nuestro algoritmo no es correcto • No mencionamos pero asumimos que ningún punto
tiene la misma coordenada ‘x’, pero se puede solucionar ordenando también con respecto a la coordenada ‘y’
• ¿Qué pasa si los tres puntos caen sobre la misma recta? • En este caso el punto intermedio no debería estar en el
CH(P). Puntos colineales deben ser tratados como si hicieran un giro a la izquierda.
• Debe usarse una condición que haga TRUE si se realiza un giro a la derecha y FALSE sino.
Introducción
Algoritmo incremental • En presencia de errores de redondeo puede
pasar que un punto sea borrado si que lo debiera ser o lo contrario.
• La integridad estructural del algoritmo permanece si daño.
• Otro problema puede ser con puntos muy cercanos con los cuales puede ser mal interpretado un giro.
• No se puede esperar algoritmos exactos si usamos aritmética inexacta.
Introducción
Degeneraciones y robustez • El desarrollo de algoritmos geométricos
comúnmente se hace en tres fases. – En la primera fase, se ignora todo lo que pueda
afectar el entendimiento de los conceptos geométricos que se quieren tratar.
– En la segunda fase, se ajusta el algoritmo diseñado anteriormente para incluir la presencia de degeneraciones.
– La tercera es la implementación. Pensar en las operaciones primitivas necesarias.
• Suponemos que se usa aritmética exacta.
Introducción
Dr. Antonio Marín Hernández
Centro de Investigación en Inteligencia Artificial Universidad Veracruzana
[email protected] www.uv.mx/anmarin
Geometría Computacional