570 likes | 895 Views
Algoritmos geométricos. Las computadoras se están utilizando cada día más para resolver problemas a gran escala que son inherentemente geo-métricos.
E N D
Las computadoras se están utilizando cada día más para resolver problemas a gran escala que son inherentemente geo-métricos.
Los objetos geométricos, tales como puntos, líneas y polígonos constituyen la base de una gran variedad de aplicaciones importantes y conducen a un interesante conjunto de problemas y algoritmos.
Los algoritmos geométricos son importantes en sistemas de diseño y análisis de modelos de objetos físicos, que pueden ser desde edificios y automóviles hasta circuitos integrados a escala muy grande.
Un diseñador que trabaja con un objeto físico posee una intuición geométrica que resulta difícil de aplicar en una representación por computadora.
Otras muchas aplicaciones procesan datos geométricos de forma directa. Por ejemplo, un esquema político de <manipulación del censo electoral>, que sirva para dividir un distrito en áreas de igual población (y que satisfaga otros criterios, como colocar a todos los miembros del otro partido en una misma zona), es un sofisticado algoritmo geométrico.
Otras aplicaciones son de tipo matemático o estadístico, campos en los que muchos tipos de problemas pueden ser naturalmente puestos en una representación geométrica.
La mayoría de los algoritmos que se han estudiado utilizan texto y número que se representan y se procesan de forma natural en la mayoría de los entornos de programación.
De hecho, las operaciones primitivas necesarias se implantan en el hardware de la mayoría de los sistemas de computadoras. Se verá que la situación es diferente en el caso de los problemas geométricos: incluso las operaciones más elementales con puntos y líneas pueden ser un reto en términos informáticos.
Los problemas geométricos son muy fáciles de visualizar, pero eso puede ser un inconveniente. Muchos problemas, que una persona puede resolver instantáneamente mirando un papel (por ejemplo: ¿está un punto dentro de un polígono?), requieren programas de computadoras que no son triviales.
En el caso de problemas más complicados, como en muchas otras aplicaciones, el método de resolución apropiado para su implantación en una computadora puede ser bastante diferente del método de resolución adecuado para una persona.
Se podría pensar que los algoritmos geométricos deben tener una larga historia, debido a la naturaleza constructiva de la antigua geometría y porque las aplicaciones útiles están muy difundidas, pero, en realidad, la mayor parte de los avances en este campo han sido bastante recientes.
El campo de los algoritmos geométricos es interesante de estudiar debido a su fuerte contexto histórico, porque aún se están desarrollando nuevos algoritmos fundamentales y porque numerosas aplicaciones importantes a gran escala necesitan estos algoritmos.
La mayoría de los programas que se estudiarán operan sobre objetos geométricos simples definidos en un espacio bidimensional, si bien se tendrá en cuenta algunos algoritmos para más dimensiones. El objeto fundamental es el punto, al que se considera como un par de enteros. Puntos, líneas y polígonos
Una línea es un par de puntos, que se supone están unidos por un segmento de línea recta. Un polígono es una lista de puntos: se supone que puntos sucesivos están unidos por líneas y que el primer punto está conectado al último, para formar una figura cerrada. polígono
Para poder trabajar con estos objetos geométricos se necesita decidir cómo representarlos. Normalmente se utiliza un array para los polígonos, aunque también se puede usar una lista enlazada o alguna otra representación cuando sea apropiado.
Struct punto {int x, y; char c; }, Struct linea { struct punto p1, p2; }; Struct punto poligono [Nmax]; Ejemplo:
Hay que destacar que los puntos sólo pueden tener coordenadas enteras. También se podría utilizar una representación en coma flotante. El uso de coordenadas enteras hace que los algoritmos sean algo más sencillos y más eficaces.
Por ejemplo, los polígonos se representarán como arrays de puntos. Se puede advertir que el uso de arrays de lineas supondría que cada punto del polígono estaría incluido dos veces (aunque ésta podría ser la representación natural para determinados algoritmos).
Además, en algunas aplicaciones resulta útil incluir información adicional asociada a cada punto o línea.
Se utilizará el conjunto de puntos mostrado en la siguiente figura, para ilustrar las operaciones de varios algoritmos geométricos.
Supongamos que los 10 puntos de la izquierda están etiquetados con letras que servirán de referencia en la explicaciones de los ejemplos y poseen las coordenadas enteras siguientes: A B C D E F G H I F X 3 9 6 7 11 15 6 8 10 16 Y 9 1 4 6 10 9 7 6 8 9
Las letras de las etiquetas se han asignado en el orden en el que se supone se introducen los puntos. Por lo regular, los programas no tienen motivos para hacer referencia a los puntos por su nombre; éstos simplemente se almacenan en un array y se referencían usando un índice.
El orden en el que se almacenan los puntos dentro del array puede ser importante en algunos programas: de hecho, el objetivo de algunos algoritmos geométricos consiste en ordenar los puntos de una forma determinada.
Como primer problema geométrico elemental, se considerará si dos segmentos determinados se cortan o no. Intersección de segmentos de líneas
En el primer caso, los segmentos se cortan, en el segundo el extremo de un segmento está situado en el otro segmento. Se considerará que esto es una intersección, suponiendo que los segmentos son cerrados (los extremos forman parte de los segmentos); por tanto, los segmentos que poseen un extremo en común se cortan. 1 2
En estos casos los extremos no se cortan, pero los casos difieren si se considera el punto de intersección de las líneas definidas por los segmentos. En el cuarto caso, este punto de intersección se encuentra en uno de los segmentos; en el tercer caso no es así. O también las líneas podrían ser paralelas 3 4
Para poder saborear los problemas que se refieren a conjuntos de puntos considérese el problema de encontrar a partir de un conjunto de N puntos, un camino que no se corte a sí mismo, que recorra todos los puntos y que vuelva al punto inicial. Camino cerrado simple
Tal camino se denomina camino cerrado simple. Es posible imaginar muchas aplicaciones para esto: los puntos podrían representar casas, y el camino puede ser la ruta que seguiría un cartero para visitar todas las casas sin cruzar su propio trayecto.
O simplemente, se podría buscar una forma razonable de dibujar los puntos usando un plotter mecánico. Este problema es elemental, porque sólo busca cualquier camino cerrado que conecte los puntos.
El problema de buscar el mejor camino es conocido como el problema del vendedor ambulante.
Una forma sencilla de resolver este problema elemental es la siguiente: se selecciona uno de los puntos, que servirá como <pivote>. Después se calcula el ángulo de las líneas que unen el pivote con cada uno de los puntos del conjunto según la dirección horizontal positiva (esto es parte de las coordenadas polares de cada punto del conjunto, con el pivote como origen), a continuación se ordenan los puntos según el ángulo calculado y por último se conectan los puntos adyacentes.
El resultado es un camino cerrado simple que conecta todos los puntos.
El siguiente problema que se va a considerar es muy natural: dados un punto y un polígono representdo como un array de puntos, determinar si el punto está dentro o fuera del polígono. Inclusión de un polígono
De inmediato se puede ver una solución directa a este problema: se dibuja una línea larga desde el punto, en cualquier dirección (lo suficientemente larga como para garantizar que el otro extremo esté situado fuera del polígono), y se cuenta el número de líneas del polígono a las que corta.
Si el número es impar, el punto debe estar en el interior; si es par , el punto es exterior. Esto se comprueba fácilmente viendo lo que sucede al acercarse desde el extremo exterior: tras la primera intersección, se está dentro; tras la segunda de nuevo se está fuera, etc.
Resulta fácil subestimar la dificultad de la resolución de un determinado problema geométrico utilizando una computadora. Existen otros muchos cálculos geométricos elementales que no se han estudiado. Perspectiva
Por ejemplo, un ejercicio interesante podría ser la realización de un programa que calcule el área de un polígono.
Los problemas vistos hasta el momento constituyen unas herramientas básicas que serían útiles para solucionar algunos problemas más complicados.
A veces, cuando hay que procesar un elevado número de puntos, lo que interesa es conocer los límites del conjunto de dichos puntos. Al observar en un diagrama un conjunto de puntos dibujados en el plano, normalmente no hay problema en distinguir los puntos que están dentro del conjunto de los que se encuentran en los bordes. Obtención del cerco convexo
Esta distinción es una característica fundamental de los conjuntos de puntos; en este capítulo se verá como se pueden caracterizar de forma precisa, examinando algoritmos que distinguen los puntos que conforman el límite natural.
El método matemático utilizado para la descripción del límite natural de un conjunto de puntos depende de una propiedad geométrica denominada convexidad.
El polígono cerrado simple que se calculó anteriormente, es no convexo; por su parte, todos los triángulos y rectángulos son convexos. Ejemplo:
Se define el cerco convexo de un conjunto de puntos del plano como el polígono convexo más pequeño que los contiene a todos. El cerco convexo es el camino más pequeño que envuelve los puntos.
Una propiedad obvia y fácil de probar del cerco convexo es que los vértices del polígono convexo que definen el cerco son puntos pertenecientes al conjunto original de puntos.
Dados N puntos, algunos de ellos forman un polígono convexo, dentro del cual están contenidos todos los demás. El problema consiste en encontrar esos puntos.
En general, el cerco convexo puede contener como mínimo, desde tres puntos (si los tres puntos forman un triángulo que contiene a los demás), hasta, como máximo, todos los puntos (si todos ellos están situados en el cerco convexo, en cuyo caso los puntos constituyen su propio cerco convexo)
El número de puntos del cerco convexo de un conjunto de puntos aleatorio está comprendido entre esos extremos. Una propiedad fundamental del cerco convexo es que cualquier línea exterior al cerco, al desplazarla hacia él en cualquier dirección, tocará al menos unos de los puntos vértice.