Envolvente convexa

INTRODUCCIÓN

La envolvente convexa, también denominada cierre convexo o convex hull, es uno de los más fundamentales constructores geométricos.

Una idea intuitiva del significado del cierre convexo es el contenido de la figura que formaría una banda elástica que rodeara a una nube de puntos una vez que la soltáramos.

El problema de computar un convex hull no sólo está centrado en aplicaciones prácticas, sino también es un vehículo para la solución de un número de cuestiones aparentemente sin relación con él, que surgen en la Geometría Computacional.

La computación del cierre convexo de una nube finita de puntos, especialmente en el plano, ha sido exhaustivamente estudiada y tiene aplicaciones, como por ejemplo, en el procesado de imágenes y en localización.

Desafortunadamente, no es posible construir la definición intuitiva de cierre convexo citada anteriormente de forma natural, por lo que hay que identificar las nociones apropiadas que nos conduzcan a un algoritmo.


DEFINICIONES

Definición: Un conjunto S se dice convexo si dado cualquier par de puntos x, y pertenecientes al conjunto se cumple que el segmento xy que forman está contenido en dicho conjunto S.

Lema: La intersección formada por cualquier grupo de conjuntos convexos dará como resultado un único conjunto que además también será convexo.

En cambio, como puede verse en la siguiente imagen, la intersección de conjuntos no convexos no tiene por que dar como resultado un conjunto único.

Definición: Dado un conjunto de puntos finito S, se dice que CH(S) es la envolvente o cierre convexo de S si:

  1. CH(S) es convexo.
  2. S está contenido en CH(S).
  3. CH(C) es el menor convexo que contiene a S.  

(NOTAS)

  • Esta definición se puede extender para conjuntos infinitos, aunque no es el caso que nos interesa.
  • Los puntos de la frontera de la envolvente convexa se llaman vértices o extremos de la envolvente convexa, pero también se les suele denominar, de forma poco afortunada, con el mismo nombre de envolvente convexa.
  • La envolvente convexa de una nube de puntos es siempre un polígono.

Corolario: Sea S un conjunto. Se cumple que la intersección de todos los convexos que contienen al conjunto S es igual al cierre convexo de S.

Demostración:

Sea IC(S) la intersección de todos los convexos que contienen a S.

El cierre convexo de S, CH(S), es un convexo y por ello forma parte de todos los convexos que contienen a S. Además es el menor convexo que contiene a S, por definición de la envolvente convexa.

Por el lema de la intersección de convexos resulta que IC(S) es un convexo, ya que es la intersección de otros convexos.

Como IC(S) contiene a S, está contenido en el menor convexo que contiene a S, que es el cierre convexo de S.


ALGORITMOS

Hay muchos métodos para el cálculo del cierre convexo, ya sea para dos, tres o más dimensiones. Nosotros analizaremos sólo algunos algoritmos para averiguar el convex hull de puntos situados sobre dos dimensiones.

Teorema: Es posible calcular la envolvente convexa de un convexo S en tiempo O(n log n), y este tiempo es óptimo.

Se puede calcular la envolvente convexa de una nube de puntos a partir de su diagrama de Voronoi en tiempo lineal, lo que junto al tiempo requerido para el cálculo del diagrama de Voronoi nos da un coste de O(n log n), que es el tiempo óptimo. Sin embargo, las constantes multiplicativas son tan grandes que el método no es práctico si no tenemos calculado de antemano el diagrama de Voronoi.

Algoritmo Quick Hull.

La idea del Quick Hull es ir descartando lo más pronto posible los puntos que no formarán parte de la frontera del cierre convexo, que suelen ser los más interiores de la nube de puntos.

Paso 1: Encontrar los cuatro puntos extremos de la nube de puntos (norte, sur, este y oeste) y formar un cuadrilátero con estos puntos como esquinas (aunque podría darse el caso de obtenerse sólo un triángulo e incluso una línea, lo cual no afecta el funcionamiento del algoritmo). Todos los puntos que hayan quedado dentro de este cuadrilátero no formarán ya parte de la frontera.

Paso 2: Los puntos exteriores al cuadrilátero se encontrarán divididos en cuatro (o menos) zonas no comunicadas.

En cada una de estas regiones obtendremos el punto más alejado al lado del cuadrilátero adyacente a dicha zona. De esta forma obtendremos una figura de hasta ocho vértices que descartará los puntos interiores como pertenecientes al borde del cierre convexo y dividirá los puntos exteriores en hasta ocho nuevas regiones.

Paso 3: Seguiremos actuando para cada nueva región según las reglas anteriores hasta que no queden vértices externos a la figura.

Esta figura resultante será el cierre convexo.

Teorema: El algoritmo Quick Hull calcula la envolvente convexa en tiempo O(n2).

(NOTA)

A pesar de ser de orden cuadrático, suele tardar menos tiempo que calculando el cierre convexo a través del diagrama de Voronoi.

Scan de Graham.

Este algoritmo utiliza una lista en la que va almacenando y ordenando correctamente los puntos que constituyen los extremos del cierre convexo.

Paso 1: Elegimos un primer punto (Por orden lexicográfico) para almacenar en la lista. A continuación vamos almacenando el resto en la lista, ordenados según el valor del ángulo que forman con el primer punto que escogimos.

Paso 2: Recorremos la lista que hemos formado, tomando en cada momento tres puntos: Inicial, Medio y Final.

Comprobamos si el ángulo que forman Inicial, Medio y Final (IMF) es negativo (sentido horario) o positivo (sentido antihorario).

Si es positivo, Medio pasará a ser Inicial, Final pasará a ser Medio y el siguiente elemento de la lista pasará a ser Final.

Si es negativo, Medio será borrado de la lista, Inicial pasará a ser Medio, el anterior elemento de la lista pasará a ser Inicial, y Final queda inalterado.

La lista obtenida al finalizar con todos los elementos de la lista será la frontera de la envolvente convexa de la nube de puntos.

Teorema: El Scan de Graham calcula la envolvente convexa en tiempo O(n log n), que es el tiempo óptimo.

Envolvimiento de regalo (Gift Wrapping).

Paso 1: Elegimos el punto A, que será el que menor coordenada y posea (así nos aseguramos que pertenezca al cierre convexo). Este punto será nuestro punto inicial.

Paso 2: Puede encontrarse otro punto B, que cumplirá que todos los puntos están situados a la izquierda de AB.

Paso 3: Similarmente, podemos encontrar C allí donde todos los puntos estén a la izquierda de BC. Repetimos este método para el resto de puntos.

La complejidad de este algoritmo será de nh, donde h es el número de caras del cierre convexo.

Algoritmo incremental.

La idea básica es ir añadiendo puntos mientras vamos modificando el cierre convexo.

Paso 1: Elegimos un punto. Si el nuevo punto está dentro del cierre, no hay nada que hacer. En otro caso, borramos todos los bordes que el polígono pueda ver, es decir, que se trazando una línea desde el punto no choquemos con ninguna otra.

Paso 2: Añadimos dos líneas para conectar el nuevo punto al resto del antiguo cierre.

Paso 3: Repetimos de nuevo desde el paso uno para los puntos que estén fuera del convex hull actual, hasta que todos los vértices estén dentro.

Si usamos una estructura para el cierre que nos permita coger una línea adyacente a otra en tiempo constante, podremos encontrar un lado visible en tiempo lineal y todos los demás en tiempo constante por lado. La actualización toma tiempo lineal.

El tiempo total es de O(n2).

Divide y vencerás.

Paso 1: Ordenamos los puntos según la coordenada x.

Paso 2: Dividimos los puntos en dos bloques, izquierda y derecha (L y R), de igual número de elementos, que cumplen que el punto más a la derecha de L está más a la izquierda que el punto más a la izquierda de R.

Paso 3: Recursivamente, encontramos el convex hull de L y R. Para mezclar el cierre de L y el de R es necesario unirlos utilizando las tangentes comunes más altas y bajas. La tangente superior común pude descubrirse en tiempo lineal explorando alrededor del cierre de L en el sentido de las agujas del reloj y en el cierre de R en el sentido antihorario. Para la tangente inferior giraremos en los sentidos inversos.

Las líneas que queden dentro de la envolvente que formamos al unir los cierres de L y R serán borradas.

Debido a que la mezcla no puede realizarse en tiempo lineal el cierre convexo puede ser encontrado en tiempo O(n log n).




APLICACIONES

Entre las múltiples aplicaciones existentes para el uso de la envolvente convexa, hablaremos de las dos siguientes: el cálculo del diámetro y el de la anchura de un conjunto.

Dada una nube de puntos S, el diámetro es la mayor distancia posible de entre todos los puntos de S.

La anchura es la menor longitud, de entre todas las posibles, entre dos rectas paralelas que contengan en su interior todos los puntos pertenecientes a S.

El uso de estas magnitudes va desde el cálculo de medidas de dispersión hasta el cálculo de trayectoria de robots.

El método más sencillo para calcular estas distancias es comparar todas las distancias para cada par de puntos y quedarnos con la apropiada. Pero el coste de este procedimiento es cuadrático.

Podemos mejorar este tiempo mediante el siguiente lema:

Lema: Tanto el diámetro como la anchura de S coinciden con el diámetro y la anchura de los puntos extremos de S.

De esta forma no es necesario comprobar todos los puntos, sino sólo los que estén en la frontera de S.

De todas formas, puede darse el caso extremo en el que todos los puntos pertenezcan al borde, siendo aún el coste de O(n2), por lo que mejoraremos el tiempo mediante otro método.

Definición: Un par antipodal vértice-vértice es una pareja de vértices extremos de S que tienen la propiedad de que un par de rectas paralelas que pasen sobre ellos contendrá a todos los puntos de S.

Definición: Un par antipodal vértice-arista son un vértice de S y una arista del cierre convexo que cumplen que la línea que contiene a la arista y su paralela que pase por el punto contienen a todos los puntos de S.

Lema: Si conocemos la envolvente convexa, podemos calcular todos los pares antipodales en tiempo lineal.

Demostración para pares vértice-arista:

Partimos de una arista cualquiera, y hallamos el vértice que, junto con la arista, formen el triángulo de mayor área posible. De esta forma obtenemos un primer par antipodal en tiempo logarítmico (ya que la función de las áreas sólo dispone de un máximo).

El resto de los pares se averiguan de esta forma:

  • Elegimos la siguiente arista en el sentido positivo.
  • Comprobamos si el vértice actual es antipodal. Si no lo es probamos con el siguiente vértice (siguiendo el sentido positivo) hasta hallar el antipodal.
  • Repetimos hasta tener todos los pares antipodales.

Puesto que nunca andamos en el sentido negativo, cada vértice sólo lo consideramos una vez y, por lo tanto, en tiempo lineal tendremos todos los pares antipodales.

Demostración para pares vértice-vértice:

Los vértices antipodales a un vértice v dado son todos aquellos comprendidos entre los vértices antipodales a las dos aristas incidentes en v. Luego podemos utilizar el método de la demostración anterior.

Teorema: Tanto el diámetro como la anchura de un conjunto S pueden ser calculados en tiempo lineal a partir del cierre convexo de S. Esto causa que el tiempo total sea de O(n log n).
Demostración:

Basta con comprobar que el diámetro es la mayor distancia entre pares antipodales vértice-vértice y que la anchura es la menor distancia entre pares antipodales vértice-arista.


BIBLIOGRAFÍA

  • Hla Min and S. Q. Zheng, Time-Space Optimal Convex Hull Algorithms.
  • A. M. DAY, The Implementation of an Algorithm to Find the Convex Hull of a Set of Three-Dimensional Points, ACM Transactions on Graphics, Vol. 9, No. 1, January 1990

Sección de ConvexHull de la página personal de Tim Lambert: https://www.cse.unsw.edu.au/~lambert/java/3d/ConvexHull.html


Profesor
Alberto Márquez

Autores de esta página
Francisco José Fernández Fadrique
Alberto García-Baquero Vega