UNIVERSIDAD NACIONAL DE INGENIERIA

Libro de Geometría Computacional

Docente: Ing. Grevin Silva Lizano

Viernes 11 de Julio de 2008

Geometría Computacional

Objetivos

Generales
Aprender los conceptos generales sobre la Geometría Computacional, sus campos de aplicación, las técnicas matemáticas que utiliza, algoritmos y estructuras de datos de carácter geométrico mas utilizados. Aplicar las técnicas de interacción graficas en la implementación de programas que resuelvan problemas geométricos planteados en dos dimensiones.

Específicos
Comprender los métodos de generación de rectas y curvas en el plano virtual representado por la pantalla de video. Implementar las primitivas graficas que permiten la creación de tales figuras básicas. Mostrar las principales técnicas algorítmicas usadas para resolver problemas geométricos: método divide y vencerás, barrido, descomposición en objetos geométricos elementales y los métodos de cruce. Evaluar comparativamente las diferentes soluciones algorítmicas para los problemas geométricos en orden de complejidad, de la menos eficiente a la más eficiente. Implementar soluciones graficas, para algunos de los algoritmos para los problemas geométricos en dos dimensiones (triangulación de polígonos, cierre convexo, inclusión de un punto en un polígono etc.) Utilizar softwares geométricos que permitan formular soluciones geométricas en altas dimensiones.

2

Geometría Computacional

Índice

UNIDAD I : INTRODUCCION A LA GEOMETRIA COMPUTACIONAL No. Pág. I.1 Que es la Geometría Computacional……………………………………….6 I.2 La Geometría y nuevas Tecnologías…………………………………………8 I.3 Áreas de Aplicación…………………………………………………………....9 I.4 Ejemplificación del uso de la Geometría Computacional………………...15 I.5 Técnicas de Interacción………………………………………………………17 I.6 Técnicas de Posicionamiento……………………………………………… .18 I.7 Entidades Geométricas Fundamentales…………………………………....19 I.7.1 El Punto…………………………………………………………………..19 I.7.2 El Segmento……………………………………………………………..20 I.7.3 Polígonos………………………………………………………………...20 I.7.4 Poliedro…………………………………………………………………..21 I.8 Operaciones con vectores……………………………………………………21 I.8.1 Modulo de un vector……………………………………………………..21 I.8.2 Suma de dos vectores ………………………………………………….22 I.8.3 Producto Escalar………………………………………………………...22 I.8.4 Producto Cruzado o Producto Escalar …………………………….....23 I.9 Algunas Aplicaciones del producto Vectorial………………………….…..24 I.9.1 Cálculo de Áreas………………………………………………………....24 I.9.2 Punto interior a un Polígono Convexo………………………………...25 I.9.3 Corte de Camino que pasa por un conjunto de puntos……………..26 I.10 Otros Algoritmos Importantes ……………………………………………..27 3

31 UNIDAD II : PRIMITIVOS GRAFICOS II.3 Teoría de Triangulación………………………………………………….41 II.1 Figuras Geométricas………………………………………………….6 Transformaciones Geométricas………………………………………….120 III.65 II.1 Test del Rayo ……………………………………………………….5 Algoritmo de Triangulación de Polígonos/Implementación………….3 Primitivos Gráficos………………………………………………………….87 III.2.43 II.66 II.3 Teoremas de la Galería de Arte …………………………………………92 III.30 I.10.10.2 Clasificación Geométrica………………………………………….27 I..……………………….2 Librerías Gráficas………………………………………………………….1 Introducción a la Gráfica por Computadoras……………………………......1 Intersección entre dos segmentos………………………………….2.10..1 Funciones de las Librerías Graficas……….Geometría Computacional I.98 III.2 Clasificación de Polígonos……………………………………………….10.1 Definición de Polígono…………………………………………………….73 UNIDAD III : TRIANGULACION DE POLIGONOS III.2..4 Área de Polígonos/ Intersección de Segmentos………………………104 III...120 UNIDAD IV : PARTICIONAMIENTO DE POLIGONOS 4 .36 II.2 Búsqueda del polígono que contiene un punto……………………30 I.3.4 Funciones para el manejo de Primitivos Gráficos……………………….86 III.

.1 Definiciones de convexidad y cierre convexo…………………………134 V.150 VII.1 Particionamiento en Piezas Monótonas……………………………….…141 VI.....1 Definiciones Básicas y Propiedades…………………………………....146 VI..2 Algoritmo para Puntos No-Extremos …………………………………..........…………………………………………………………..2 Triangulación Delaunay…………………………………………………..Geometría Computacional IV..4 Quick Hull.139 UNIDAD VI : DIAGRAMA DE VORONOI VI.....137 V...131 UNIDAD V : CIERRE CONVEXO V........3 Gift Wrapping…..138 V..2 Particionamiento en Trapezoides……………………………………….....3 Particionamiento Convexo……………………………………………….......129 IV.....2 Intercambio de Segmentos en Polígonos Convexos…………………152 UNIDAD I : INTRODUCCION A LA GEOMETRIA COMPUTACIONAL 5 .....3 Algoritmos y Aplicaciones en Detalle……………………………………147 UNIDAD VII : BUSQUEDA E INTERSECCION VII.....126 IV.........1 Punto que esta en el interior de un Polígono………………………….................................

De hecho el arte de la buena programación en esta área gira en torno a este concepto. sin embargo es con el advenimiento de las PC. los métodos pueden ser poco robustos (en general andan bien. pero en ciertos casos pueden no funcionar). que las aplicaciones de computer graphics están alcanzando su máximo potencial. −. pueden dar un resultado equivocado. 2. Para medirla sin haber de programar y ejecutar cada algoritmo. ×. 3. operaciones aritméticas básicas (+. acceso a la memoria. y fue ahí cuando se desarrollaron la mayoría de los algoritmos geométricos que se utilizan hoy en día. Si esto no se tiene en cuenta. >). _=. comparación de dos números reales (<. y las operaciones siguientes se consideran primitivas y pueden realizarse con coste unitario: 1. al punto que ya en la década del ’50 existían sistemas rudimentarios de CAD (Computer Aided Design). A finales de los ’70 y comienzos de los ’80 aparecen las Work-station. funciones trigonométricas. los video-juegos. ≤. (ocasionalmente) raíces enésimas. los efectos especiales y recientemente la realidad virtual. /).1 Qué es la geometría computacional La Geometría computacional ha sido siempre un área importante en ingeniería.Geometría Computacional I. ≥. un criterio fundamental de eficiencia es la rapidez de ejecución. a pesar de que el hardware de esa época era sumamente limitado. Análisis de algoritmos Cuando los algoritmos han de ser utilizados por una máquina. 4. Una particularidad de los algoritmos geométricos es que por el hecho de requerir de operaciones con números reales. la exponencial y el logaritmo. En el RAM real se acepta que un número real se puede almacenar en una unidad de memoria. =. se utiliza un modelo teórico de máquina en el que ciertos procesos tienen asignado un coste (= tiempo) unidad. 6 .

Geometría Computacional El comportamiento de un algoritmo depende del conjunto específico de datos sobre los cuales se ejecuta cada vez. Como los algoritmos se diseñan para grandes valores de n. o bien de uno O (n4). uno O (n2) tardaría unos 10000 × 10000 μs. y uno O (n4) tardaría ¡unos 317 años! Si hay 100000 datos. dejamos al lector las cuentas para el O (n4). Muchos avances espectaculares en la rapidez de los ordenadores son en realidad mejoras en los algoritmos (que se traducen en el software).4 segundos y a 2 horas y 47 minutos. sino en orden de magnitud. de un algoritmo de orden O(n log n). La cantidad de datos recibidos por el algoritmo se mide en función de algún parámetro n. de uno O (n2). Escribimos T(n) O (f(n)) para acotar superiormente el tiempo de ejecución T(n) de un algoritmo. hay una diferencia abismal de disponer. que son ya en milenios. y el coste será una función T(n). Por ejemplo. si hemos de calcular la distancia entre dos puntos. 7 .04 segundos. tardaremos O (1) (¡o sea tiempo constante!). Así. El análisis en el caso peor. respectivamente. los dos primeros pasan a = 0. es decir 1 minuto y 40 segundos. el único que describiremos aquí. ignorando los coeficientes constantes. Si la unidad de medida es la millonésima de segundo (= 1 microsegundo = 1 μs) y se tienen 10000 datos. un algoritmo O(n log n) tardaría del orden de 10000 × 4 μs = 0. tal como acabamos de ver. consiste en calcular el coste total (= numero de operaciones primitivas) de ejecutar el algoritmo en la situación mas desfavorable. y si hemos de leer una matriz 2n × 300n tardaremos O (n2). Vale la pena detenerse para comprender la gran importancia de tener un coste u otro. al resolver un problema. las cuales incrementan drásticamente la rapidez de ejecución. no se calcula T(n) “exactamente”.

por ejemplo. la Visión artificial. ya que ha sido un avance producido por una acción combinada de muchas disciplinas científicas. pero. producción o estudio de objetos y de procesos. de una u otra forma. la Caracterización y reconocimiento automático de formas. a veces de forma significativa. 8 . en una resonancia magnética se construyen imágenes a partir de medidas de la respuesta del cuerpo a campos magnéticos e impulsos de radiofrecuencia. La señal inducida se transforma en imágenes vía una serie de algoritmos que utilizan una mezcla compleja de física. no se puede decir que la resonancia magnética haya sido un avance “de la medicina”. participan en todos estos avances tecnológicos. el Diseño y fabricación asistidos por ordenador (CAD/CAM). interpretación. sino como herramienta en la investigación y en la producción. Del mismo modo que un destornillador o un martillo son herramientas en la construcción de un mueble.Geometría Computacional I. y comprensión global de lo que se hace. Las matemáticas.2 La Geometría y nuevas tecnologías Una característica fundamental de las tecnologías que han aparecido o se han consolidado a partir del ultimo cuarto del siglo XX es que están constituidas por la aportación conjunta de muchas ramas de la ciencia. Otra de las características de las tecnologías mas recientes es el uso crucial del ordenador. mencionaremos la Informática gráfica. La génesis. Entre estas. Así. los ordenadores actualmente una herramienta utilizada en el diseño. veremos a continuación diversas áreas de investigación aplicada en las que tiene participación sustancial. como vemos. matemáticas y técnicas de computación. corresponden a ramas diversas de la medicina. el Diseño de circuitos integrados gigantes. En el caso de la geometría. no ya como destinatario de las aplicaciones desarrolladas. pero poco visible. a veces con un protagonismo crucial. los Sistemas de información geográfica y la Robótica.

la geometría juega un papel determinante (Figura 1). como a ajustar y prever su adecuación funcional.3 Áreas de aplicación de la Geometría Computacional Una característica esencial de los objetos es su “forma”. extraerla. de lo cual es ejemplo claro el diseño industrial. o adaptarse a los requisitos de los sistemas de manipulación cuando las formas se están creando. y cuando la manipulación no se hace en términos de píxel (2D) sino como proyección de un modelo matemático cuyas propiedades se mantienen. y es natural que la geometría sea herramienta matemática indispensable para describirla. analizarlas.Geometría Computacional I. diseñarlas y estudiar su comportamiento. modificarla o aproximarla. En este ultimo caso. 9 . cuando se trata de objetos dados. Figura 1: Esquema de proyección en pantalla. Naturalmente la representación de formas es el núcleo de la Informática grafica. los sistemas ayudan tanto a conseguir características estéticas del objeto. Todo ello exige adaptarse a los métodos existentes de medición y de toma de muestras. El Modelado geométrico trata la representación de formas de cara a visualizarlas.

no sólo de forma que se llegue al resultado deseado.Geometría Computacional La definición y exploración de una “forma” puede hacerse con un sistema CAD (Computer Aided Design). como decíamos. Una posibilidad es que sean obtenidos a partir de masas sólidas (como. bloques de metal o de piedra) y que se precise programar los movimientos de las herramientas o robots que efectúan los cortes. pero también en la arquitectura (Figura 2). por ejemplo. En el caso en que el proceso de producción utilice el corte con filamento electrificado. 10 . Este es un proceso corriente. en la fabricación de objetos. que permite mover puntos de control y modificar el aspecto. la forma externa se compondrá de superficies regladas. Otro aspecto es el de la fabricación propiamente dicha de los objetos. sino también evitando colisiones y optimizando el proceso global.

o con un mecanismo táctil para obtener coordenadas (Figura 5). 11 . como el que la separación de la forma teórica. como el coordinante measuring machine. este dentro del intervalo de los márgenes aceptables. El objeto se “captura” geométricamente con alguna forma de scan. las cuales idealmente se tendrían que poder articular con los sistemas de CAD estándares (Figura 4). Figura 5: Reconstrucción digital de una copa [3].Geometría Computacional A veces el diseño incluye animaciones y simulaciones de movimiento. Un aspecto importante es el de comprobar que se cumplan determinados requisitos. así como en cuanto a las desviaciones del modelo CAD. se verifican los productos respecto a lo que se deseaba obtener. la tolerancia. digamos cilíndrica. por ejemplo. que en algunos aspectos incluye lo que se llama control de calidad. En los procesos de inspección industrial.

también aplicaciones médicas esta es un área central de investigación y desarrollo. como estudiarlo o modificarlo para mejorarlo. del cual es evidentemente un ingrediente la capacidad de interpolar entre secciones (Figura 6) para llegar a la generación de un modelo digital tridimensional. es un proceso común a la producción industrial y a la diagnosis médica. 12 . El estudio de un cuerpo a partir de las imágenes obtenidas como secciones planas del mismo. Como es fácil de imaginar. permite examinar automáticamente cadenas de montaje de bebidas para comprobar que no haya problemas con las botellas hasta verificar los fusibles en una cadena de montaje de coches. No sólo permite fabricar nuevos objetos idénticos al anterior. sino también muchas otras posibilidades. Figura 6: Interpolación entre secciones planas [4]. Por ejemplo.Geometría Computacional El proceso que hemos mencionado de capturar puntos de un objeto para hacer un modelo CAD recibe el nombre de “construcción inversa” (Reverse Engineering). La Visión por ordenador combina herramientas para capturar ciertos datos de los objetos con algoritmos para detectar determinadas cualidades con la información obtenida. técnica llamada tomografía.

13 . pero que generan problemas importantes de gestión geométrica e informática. o el barrido láser desde el aire.7]. como el posicionamiento por satélite. dan la posibilidad de obtener conjuntos enormes de datos. Los terrenos se modelan digitalmente. lo que permite representarlos.Geometría Computacional Figura 7: Dos modelos digitales de terrenos [6. La moderna cartografía digital es otro campo de aplicación fecunda. candidatos a producir imágenes y modelos ajustadísimos. hacer simulaciones y generar simplificaciones (Figura 7). Se ha de tener en cuenta que las nuevas técnicas de medición. con mallas triangulares o cuadrangulares.

así como la necesidad de posibilitar la transmisión rápida y precisa de modelos geométricos complejos. 14 . una imagen sencilla en una pantalla de ordenador. Finalmente. Así. La planificación de los movimientos para cumplir las tareas deseadas en los momentos precisos. evitando problemas y colisiones. Todas estas disciplinas. que permitan representaciones menos voluminosas de los objetos a medida que se necesite menos precisión (Figura 8). comparten una característica fundamental que el lector debe tener siempre presente al pensar en los problemas de Geometría computacional que se originan. pero hay que recordar los miles de péquennos robots que se utilizan en cadenas de montaje. quizás convenga decir que cuando pensamos en robots a menudo nos imaginamos maquinas con gran autonomía y movilidad propia. Y si la reconstrucción de una copa puede hacerse con unos cuantos cientos o miles de puntos. cuando no incluso antropomórficas y sofisticadas. comentaremos que el desarrollo acelerado de Internet ha hecho que sea imprescindible disponer de estructuras para la representación eficiente en sistemas multimedia.Geometría Computacional Tanto en el caso de los terrenos (pensemos en los simuladores de vuelo) como en la representación de objetos (pensemos aquí en las visitas virtuales a los museos) es necesario poder disponer de buenos algoritmos de simplificación. puede constar de miles o decenas de miles de objetos elementales (como triángulos). y que abordaremos en la próxima sección: el carácter masivo de la información manipulada. que serán cientos de miles en una imagen cinematográfica. Por lo que respecta a la Robótica. la descripción de una región en un sistema de información geográfica requerirá la manipulación de varios millones. es también un cometido de fuerte contenido geométrico. mucho mas cercanos a la idea de mecanismo articulado. por ejemplo al alejarnos de ellos. además de tener como rasgo común el carácter geométrico de los objetos involucrados.

La Cartografía La gráfica por computadora es usada para preparar mapas de alta precisión sobre la geografía u otros fenómenos naturales.Geometría Computacional Esta es un área actualmente en ebullición. demográficos. topográficos y otros. de vegetación. Además de los geográficos. redes telefónicas y computadoras. automóviles. eléctricos. como la diagnosis. gráficas de producción o de inventario. o de otro tipo. aviones. el diseño o la visualización I.4 Ejemplos de Geometría Computacional La Graficación de Datos Numéricos Los conjuntos de datos numéricos y las funciones que se ocupan en las ciencias y la administración son más comprensibles presentados en la forma de una gráfica de barras o sectores. plantas eléctricas y químicas. Tales sistemas incluyen edificios. hay mapas de tránsito. pues se aspira a poder hacer a distancia muchas de las cosas que hemos mencionado. gráfica cartesiana. Algunos sistemas de CAD se enfocan 15 . El Diseño y el Dibujo Asistido por Computadora (CAD) Sistemas de CAD son usados para diseñar componentes y sistemas de dispositivos mecánicos. sistemas ópticos. motores. meteorológicos. Viendo una gráfica así se pueden deducir rápidamente los patrones o características de los datos. y electrónicos.

Otro ejemplo puede ser un aeropuerto. donde el despliegue de control de tráfico puede apuntar a la par de cada nave su número de vuelo. poniendo efectos como distintos tipos de terreno. juegos de video. distorsión de materiales bajo presión. en una planta química el despliegue puede mostrar cuán lleno es un tanque y usar color para mostrar su temperatura. reacciones químicas. otras aeronaves. El Control de Procesos Mientras la simulación permite al usuario interactuar con un mundo sintético. altura y velocidad. y los órganos humanos. La Simulación y la Animación La gráfica por computadora puede ser usada para estudiar el comportamiento de sistemas reales o teóricos. A veces "postprocesan" el diseño para sacar listas de componentes o materiales. publicidades y videos informativos. La mayor comprensibilidad de la información gráfica minimizaría los choques. y las luces del aeropuerto de noche. por ejemplo: las propiedades eléctricas. y desplegar con intermitencia un mensaje cuando sucede una condición crítica. y los modelos matemáticos de sistemas tales como flujos hidráulicos. estructurales o químicas.Geometría Computacional solamente en la producción de dibujos para un sistema. Por ejemplo. viento. Se pueden dibujar medidores para mostrar presión y volumen de flujo. La animación por computadora es también utilizada para hacer caricaturas. nubes. Permite al científico examinar los cambios sobre el tiempo de funciones matemáticas. Despliegues de estado para plantas químicas y eléctricas. También se pueden simular vuelos para entrenar pilotos. refinerías. otras aplicaciones le permiten interactuar con el mundo real para monitorear y controlar procesos. ayudando al controlador a manejar el tráfico. térmicas. 16 . Otros se enfocan en la realización de pruebas o simulaciones sobre el diseño. El supervisor del proceso puede ajustar válvulas o controles de temperatura que son controlados por la misma computadora. aeropuertos y redes de computadoras exhiben valores de datos registrados en partes críticas del sistema.

Estos permiten la generación del arte de la publicidad con mayor rapidez y menor costo que los métodos manuales. se pueden preparar y difundir documentos electrónicos que incluyen elementos gráficos tales como un organigrama o gráfico de barras. son exhibidas en la misma pantalla de la computadora. En todos estos campos de la gráfica por computadora se nota que se están creando con mayor frecuencia imágenes que.Geometría Computacional La Tipografía y la Automatización de Oficinas Se puede preparar tipografía de documentos para la publicación en una pantalla gráfica. e imágenes fotográficas grabadas con una cámara de video o un "scanner". en vez de transferirlas a otros medios tales como papel y película. El arte por computadora. I. integrando al texto dibujos sintéticos como las gráficas de barras o los dibujos arquitectónicos. está ganando reconocimiento como un medio legítimo de la expresión artística. exhibiendo texto con distintas fuentes y tamaños de caracteres. Para la automatización de una oficina. a pesar del rechazo por algunos "puristas". en el diseño de cirugía ocular u otros desarrollos.5 Técnicas de interacción 17 . También se usa la gráfica por computadora para preparar diapositivas para presentaciones científicas y educativas. El Arte y la Publicidad Se pueden preparar imágenes para comunicar un mensaje usando las técnicas de dibujo y pintura por computadora. No sospechamos en nuestra práctica diaria la cantidad de teoría matemática que está involucrada en los modernos aparatos de diagnóstico. Uno de los avances más notables de los últimos tiempos de la aplicación de la matemática computacional es en la medicina.

tratando de dar la mejor asistencia posible al usuario para la función que este debe realizar. En estas situaciones.6 Técnicas de posicionamiento El objetivo de las operaciones de posicionamiento es permitir la introducción de un punto. 18 . En el ejemplo anterior se puede hacer que el cursor solo se mueva en horizontal. En esta sección se examinan algunas de las técnicas de posicionamiento y selección más usadas. el usuario debe introducir una posición que satisfaga una determinada condición. Figura 3.2. la aplicación puede ayudar al usuario a realizar su tarea proporcionándole técnicas específicas que simplifiquen el proceso de interacción.Geometría Computacional Con frecuencia. el diseño de software de entrada debe de tener en cuenta el contexto concreto en el que va a utilizar. por ejemplo tener la misma coordenada x que la posición previa. que utiliza un dispositivo que controla un cursor. el proceso de entrada es el que se muestra en la figura 3. I.a.2 Posicionamiento. Desde el punto de vista del usuario (a). En general. Desde el punto de vista del usuario. y del software de entrada (b).

o “tantos millones de cuadrados”. A su vez. Por ejemplo. tetraedros. A continuación se detallan las entidades geométricas fundamentales. o superficies bicúbicas. suele encontrarse datos como “tantos millones de triángulos por segundo” pero nunca “tantos miles de círculos”. y finalmente cada segmento se define especificando la posición de sus puntos extremos. 19 . las entidades geométricas que se utilizan son siempre las más simples: rectas. Por ejemplo en 2-D [x.z]. De hecho el hardware está especialmente preparado para recibir este tipo de entidades y no otras1. los cuerpos se describen descomponiéndolos en entidades más simples. I.y. Objetos más complicados son modelados con varios objetos simples (una línea cúbica con un conjunto de rectas o una esfera con un conjunto de triángulos).Geometría Computacional I. y x Descripción de un punto en 2D 1 En la especificación de una placa gráfica por ejemplo.7 Entidades geométricas fundamentales Siguiendo una política usual en el ambiente computacional. un poliedro 3D puede ser descrito a través del conjunto de polígonos que forman su superficie.7. como el caso de curvas splines. cada polígono puede descomponerse en un conjunto de segmentos. Salvo algunas excepciones.y] y en 3-D [x.1El punto Se lo define como una n-upla de números reales. triángulos. etc. Indica una posición en el espacio y se lo suele representar con un vector con la base en el origen y la cabeza en la posición.

El polígono más simple es el triángulo.7.P1] Representación de un vector en 2D I. Polígono no-convexo en 2D 20 .3 Polígonos Se llama así a una superficie plana cuyo borde está formado por segmentos rectos. Otra forma de definir convexidad es pidiendo que todo segmento con sus extremos en el interior del polígono no corte un segmento de borde.2 Segmento Se lo define a través de sus dos puntos extremos [P1. Cualquier polígono puede ser descompuesto en un conjunto de triángulos.P2] ≠ [P2.Geometría Computacional I. En ese caso [P1.7. Se dice que el polígono es convexo si todo su borde es visible desde todo punto de su interior.P2] y P2 x P1 Si un segmento tiene orientación se lo llama vector.

8 Operaciones con vectores Casi sin excepción. I.8.4 Poliedros Poliedro es un volumen cuya superficie está formada por polígonos. dos de los cinco poliedros regulares I. Igualmente se dice que el poliedro es convexo si su superficie es visible desde todo punto de su interior. La aplicación a casos generales es inmediata desplazando primero el vector al origen.1 Módulo de un vector Es el tamaño del vector y se calcula como: sqrt(x2 + y2 + …) 21 . En todos los casos se ha considerado que la base de los vectores se encuentra en el origen.Geometría Computacional I.7. El poliedro más simple es el tetraedro (formado por cuatro caras triangulares). los algoritmos geométricos requieren de operaciones con vectores. Se incluyen a continuación las más comunes. El tetraedro regular y el cubo.

cuyas componentes son la suma una a una de las componentes de los vectores originales: y1 En 2D: S1+S2: [x1. En efecto es la forma más económica de hacerlo.y1] . S1 = |S1|.|S2|.2 Suma de dos vectores La suma de dos vectores es otro vector.8.y1] + [x2. S2 = S2 .x2 + y1.cos α y S2 α x S1 Esta propiedad resulta muy útil para calcular el ángulo entre dos vectores. y2] = x1. y2] = [x1+x2.[x2.y1] .Geometría Computacional I. [x2. 22 . y2] = [x1-x2.y2 Se puede demostrar que S1 . y1+y2] Igualmente S1-S2: [x1.8.3 Producto escalar El producto escalar de dos vectores es un número real y se lo define como: [x1. y1-y2] y2 S2 x1 S1 x2 Suma de vectores en 2D I.

y2) i (z1.x2-x1.y2-y1.|S2|.x1.1 Producto cruzado o producto vectorial El producto vectorial de dos vectores es otro vector de módulo |S1 x S2| = |S1|.z2) j (x1.x2 .y2 .y2.8.x2] 23 . z1.Geometría Computacional I.z2 .z2.z2-z1. x1.sin α y dirección normal a los dos vectores originales siguiendo la regla del tirabuzón: S1 x S2 => dirección positiva (saliente del papel en el dibujo) S2 x S1 => dirección negativa (entrante) El producto vectorial se puede evaluar como el determinante de la matriz: i S1 x S2= j k x1 y1 z1 x2 y2 z2 y S2 S1 x (y1.x2) k S1 x S2 : [y1.y1.z1.

x)*(p2.5. double area_triang (Point p0.y. la función en C que evalúa esta área se puede escribir como: struct Point {double x.y)*(p2.x-p0. Point p1.x2)/2 Dado entonces tres puntos.1 Cálculo de áreas El módulo de S1 x S2 es igual al área del paralelogramo formado por los dos vectores.x-p0.y) – (p1. return area*0.y1.y2 . }. ya que el vector resultante solo tiene componente Z: A = x1. En el caso de 2D esta área puede entonces calcularse sin necesidad de evaluar una raíz cuadrada.y2 .x2 Esta es la forma usual de calcular el área de un triángulo: At = (x1. Point p2) { double area.Geometría Computacional I.9 Algunas aplicaciones del producto vectorial I.y-p0.y1.y-p0.x). area = (p1.9. } 24 .

el producto vectorial puede utilizarse para saber si el punto está a la derecha o a la izquierda del segmento: Si [P2 . Dado que esta descomposición puede no ser simple de plantear. pero es simple comprobar que la sumatoria de todas ellas dará como resultado el área del polígono. Algunas de las áreas de triángulos podrán tener valor negativo.2 Punto interior a un polígono convexo Dado un segmento [P1.P2] y un punto P. un polígono puede ser descompuesto en un conjunto de triángulos. Nótese que el punto no tiene porque estar dentro del polígono. y que este no tiene porque ser convexo. resulta más práctico calcular esta área como la sumatoria del área de todos los triángulos formados por un punto cualquiera y los segmentos que describen el polígono (ver figura).P1] > 0 Caso contrario => izquierda => derecha P1 P2 P 25 . I.P1] x [P .Geometría Computacional También puede utilizarse para calcular el área de cualquier polígono.9. ya que como se dijo.

basta que el punto esté a la derecha de un solo segmento para que se considere que está fuera del polígono. I. Luego se ordena los puntos según valores crecientes de cos(α) y se define la polilínea uniendo los puntos en este orden. el costo computacional de este algoritmo resulta algo elevado. Una alternativa mejor es construir un árbol binario insertando los puntos en forma ordenada utilizando como función de comparación “El punto correspondiente al vértice del árbol esta a la derecha o a la izquierda del segmento actual?” 26 . entonces el punto es interior. Como el polígono se asumió que es convexo. Dado que el cálculo de cos (α) requiere evaluar el módulo de cada segmento [Pi-P0].9.3 Camino que no se corte y que pase por un conjunto de puntos Supongamos que se desea trazar una polilinea cerrada que pase por un conjunto de puntos dados y que no se corte a si misma: Un algoritmo posible es tomar el punto P0 con menor coordenada “Y” como origen y evaluar los cos(α) que forman cada segmento [Pi-P0] con el eje “X”. si el punto se encuentra a la izquierda de todos los segmentos que forman el polígono.Geometría Computacional Utilizando esta propiedad.

10 Otros Algoritmos Importantes I. Normalmente en las aplicaciones que interesan. Es decir: Si (xs1max < xs2min) => no hay corte Si (xs1min > xs2max) => no hay corte Si (ys1max < ys2min) => no hay corte Si (ys1min > ys2max) => no hay corte 27 . a) b) En estos casos. Dado que en algunos problemas esta operación se realiza un número muy grande de veces (se pueden tener millones de pares de segmentos por ejemplo).1 Intersección entre dos segmentos Interesa saber si dos segmentos en el plano { [x1.y1].Geometría Computacional I. [x2. [x4.y3].10. estos millones de segmentos tienen baja probabilidad de cortarse. { [x3.y2] }. un primer chequeo que vale la pena aplicar es verificar que las bounding-box de los segmentos tengan alguna superposición. interesa determinar si hay o no corte en la forma más eficiente posible. ya que se tratan de situaciones como la de la figura a) y no como la de la figura b).y4] } se cortan.

caso contrario no lo hay. en el tercer caso S2 cumple el test. 28 . El algoritmo requerirá 20 operaciones para indicar que hay un corte. Ahora bien. pero no puede asegurar más que eso. En el caso de que estén del mismo lado. Si también en este caso queda un punto de cada lado del segmento. Para efectivamente determinar si hay o no corte puede utilizarse alguno de los dos algoritmos que se describen a continuación. Alg. en el segundo el segmento S1 cumple el test. entonces hay corte. En general con solo tres o cuatro operaciones se están descartando la gran mayoría de los casos. Finalmente en el cuarto caso tanto S1 como S2 cumplen el test de que los dos puntos del otro segmento están en lados opuestos y por lo tanto hay corte. La figura muestra las diferentes situaciones que pueden darse (sin tener en cuenta los casos “patológicos”. necesariamente no hay corte. este análisis agrega 8 operaciones inútiles. pero no S1. este test solo descarta muchos casos en los que no hay corte.Geometría Computacional Donde: xs1max : coordenada X máxima del primer segmento xs1min : coordenada X mínima del primer segmento Si bien en los casos en que efectivamente hay corte. En caso contrario se repite la operación tomando ahora el otro segmento y el otro par de puntos. en que algún punto de un segmento se encuentra sobre la recta del otro): S1 S2 S2 S1 S1 S2 S1 S2 En el primer caso los dos puntos de S2 están del mismo lado del segmento S1 y los dos de S1 están del mismo lado de S2. pero no así el S2. 1: Utilizar el producto cruzado para determinar si los dos puntos que forman un segmento están del mismo lado o en lados opuestos del otro segmento.

Geometría Computacional Alg.B2) Igualando las dos ecuaciones de recta => A1.x + B A y B son coeficientes a determinar.y2] del segmento se resuelve: y1 = A.x2 + B => A = (y2-y1) / (x2-x1) B = y1 – A.y1] y [x2.B1).x1 + B y2 = A.10. de rectas (A1. 2: La otra alternativa es calcular el punto de corte entre las rectas definidas por los dos segmentos y verificar que dicho punto pertenece o no a alguno de los segmentos: Ecuación de la recta: y = A.x + B2 = > xc = (B2-B1)/(A1-A2) Para saber si hay corte basta verificar (utilizando ambos segmentos) que: Si xc < x1 && xc < x2 || xc > x1 && xc > x2 => no hay corte Caso contrario => Hay corte.x1 Dados los dos segmentos => dos ec. Dados [x1.2 Búsqueda del polígono que contiene un punto 29 . (A2. pero además de indicar si hay o no corte. I. Este algoritmo requiere prácticamente la misma cantidad de operaciones que el anterior. permite calcular las coordenadas del punto de corte.x + B1 = A2.

pero que ocurre si la semi recta corta al borde en un vértice como en los casos de la figura? Se contabiliza un corte o dos? Y si pasa justo por un segmento? 1 2 30 . y en muchos casos la cantidad de polígonos presentes puede ser muy elevada. ese algoritmo puede fallar. Hasta aquí todo bien. Si el número es par. Veamos primero como manejar el caso de polígonos no convexos: I. pero es fácil ver que si el polígono es no-convexo.2. los requerimientos más corrientes plantean un problema levemente distinto: interesa encontrar cual es el polígono que contiene un punto dado.Geometría Computacional Ya se vio que el producto vectorial puede ser utilizado para saber si un punto es interior a un polígono convexo. Por otro lado.1 Test del Rayo: Una alternativa para estos casos es el test del rayo: se traza una semi recta cualquiera desde el punto en cuestión y se analiza cuantas veces corta esta semirrecta al contorno del polígono. entonces el punto es exterior y si es impar se encuentra en el interior.10. Cuatro cortes => OUT Un corte => IN Como cualquier semi recta es válida. ya que una semi recta general requeriría más operaciones. en general se utiliza una horizontal al eje X y en dirección positiva.

Se comienza a recorrer el contorno calculando con cada vértice el producto vectorial para saber si se cambió de lado. Se evalúa si se encuentra a la derecha o a la izquierda de la semi recta y se marca una variable lado (con derecha o izquierda).2. pero su extensión a más dimensiones u otras entidades es trivial. Para el caso de la semi recta 1 de la figura no detectará corte. 31 . La solución a este problema viene también de la mano del producto vectorial: Se supone que el contorno está ordenado en algún sentido (anti horario en general) y se comienza entonces con el primer vértice con coordenada X mayor que la del punto. Un recurso valioso en geometría computacional para bajar los costos de búsquedas de entidades geométricas es realizar primero una clasificación u ordenamiento de las mismas. El algoritmo obvio en este caso sería recorrer todos los polígonos y analizar si el punto es interior al mismo.0 para el producto vectorial no se considera cambio. se incrementa el contador de número de cortes y se cambia el estado de la variable lado. Su costo computacional será por lo tanto proporcional al número de polígonos presentes. entonces este algoritmo contabilizará correctamente si el número de cortes es par o impar (lo que no quiere decir que contabilice bien el número efectivo de cortes). En base al problema de buscar el polígono que contiene un punto se describen aquí dos estrategias de clasificación geométrica: Grillas regulares y trees (quad-trees en 2D y oc-tree en 3D). Cuando se produce un cambio. Se continúa así con todos los vértices con coordenada X mayor que la del punto en cuestión (recordar que es una semi recta y no una recta).2 Clasificación geométrica Volvamos ahora al problema de encontrar cual es el polígono (convexo o no) que contiene un dado punto cuando la cantidad de polígonos presentes es muy alta. I. La descripción se realiza en 2D y las entidades geométricas que se clasifican son polígonos.Geometría Computacional 3 Es claro que el algoritmo así planteado fallará en estos casos. mientras que para el 2 y el 3 detectará correctamente un corte.10. Si el resultado 0.

y]. esto se consigue tomando M ≅ N ≅ sqrt (NumPolig). En casos donde el tamaño de los polígonos es bastante uniforme y equidistribuidos en el espacio. el segundo paso también tiene un costo computacional constante. lo cual requiere las siguientes operaciones: i = M*(x-xmin)/ (xmax-xmin) j = N*(y-ymin)/ (ymax-ymin) b) Buscar en la lista de polígonos asociada a esa celda cual es el que lo contiene.Geometría Computacional Grillas: La idea en este caso es dividir el espacio en una grilla regular de MxN celdas de forma que cada celda sea intersectada por unos pocos polígonos La estructura de datos para este caso es un arreglo de MxN listas. por lo que esta técnica será conveniente de utilizar cuando la cantidad de puntos que se analizarán es lo suficientemente grande. Una vez que este arreglo ha sido creado. Si la grilla es lo suficientemente densa de forma que la cantidad de polígonos en cada celda sea independiente del número total de polígonos. 32 . donde cada lista contiene los polígonos que intersecan esa celda. j] que contiene al punto [x. encontrar el polígono que contiene al punto (suponiendo que alguno lo contiene) se divide en dos etapas: a) Encontrar la celda [i. El costo computacional de generar la estructura de datos es proporcional al número de polígonos.

pero que permite visualizar el problema: Una estructura de datos interesante para estos casos es el empleo de quad-trees. En la figura se muestra un caso no tan violento. La raíz del árbol representa un rectángulo que incluye completamente este dominio. Se trata de un árbol donde cada vértice puede tener cuatro hijos o ninguno (en 3D serían ocho hijos o ninguno) y representa un rectángulo (paralelepípedo en 3D) que cubre un cierto área del dominio de interés.Geometría Computacional Quad-trees: El principal inconveniente de clasificar mediante una grilla regular es que la condición de obtener pocos polígonos por celda puede volverse inaccesible cuando la distribución de polígonos no es uniforme. o cuando existen grandes diferencias de tamaños (por ejemplo 1 a 1000). 33 .

yc indican la posición del centro de la celda. *BL. TLTR TL BL BR TR BL BR Las variables xc. tamy. }.Geometría Computacional Una representación posible para un vértice de este árbol sería: struct vertice { double xc. *BR. struct vertice *TL. dato necesario para poder descender por el árbol en busca de la celda que contiene un punto dado. *TR. tamx. yc. El 34 .

Geometría Computacional

tamaño de la celda (tamx, tamy) es necesario en los casos en que se quiere dividir la celda en sus cuatro hijos. Volviendo al problema del polígono que contiene un dado punto, utilizando esta estructura la primera etapa de buscar la celda terminal que contiene al punto requiere descender por el árbol y por lo tanto tendrá un costo computacional O(logN) en lugar de constante como se tenia con la grilla. La ventaja de esta estructura es que se puede adaptar el tamaño de celda en forma independiente en cada parte del dominio con la consiguiente economía en memoria.

La siguiente función permite encontrar el terminal que contiene al punto x,y en forma no recursiva: struct vertice *find(struct vertice *raiz, double x, double y) { struct vertice *vert = raiz; while (vert->TL) { if (x < vert->xc) if (y < vert->yc) else else if (y < vert->yc) else } return vert;
Álgebra y Teoría de Números: criptografía, ¿Qué tipo de problemas quiere resolver? Todo lo escrito anteriormente parece una mensajes cifrados y seguridad informática. pintura solamente de los países altamente desarrollados y es claro que Allí estará la matemática la aplicación de la matemática está estrechamente vinculada al desarrollo industrial. Pero en países como el nuestro, con la reactivación industrial, las industrias, aun las pequeñas, comienzan a requerir la optimización de Dinámica computacional de fluidos: diseño, Modelos modelos. La matemática suministra modelos a las distintas áreas del conocimiento. para cirugías aviones, automóviles. En problemas como Ecuaciones diferenciales: aerodinámica, vibraciones. UNIDAD II : PRIMITIVOS GRAFICOS Para darse alguna idea de lo que esto significa, Ya hay empresas privadas o institutos que requieren activamente eloptimizar elde este de enormes cantidades de Pero desarrollo tráfico del imágenes la IMPSA, ¿Pero qué significa esto? ¿Cómo se puedeno es el diagnóstico rubro: SIDERCA, única consideremos la descripción por Fields Intitute en CIMEC, INVAP, etc., ycomunicaciones, informática. Matemática discreta: es de esperar que las exigencias aumentencomunicaciones de bandacomputarizada es ayuda complejas teorías datos Torontoconsiderablemente.ade ciencia médica. enLuego, de la matemática la ancha las (Canadá): ‘La animación Finalmente, analizar y confiablemente? numérico que combina de cuyos resultados una ciencia La matemática nodatos y mera especulación intelectual, sino análisis ecléctica son necesarias manera que estudia problemas concretos visualizar los es una Sistemas formales y lógica: seguridad Por dar solamente algunos ejemplos más, matemática, ciencia para resolver numéricamente la representan unque son significativo aporte al acervo cultural y tecnológico de la humanidad y revelan el papel cada resultados verificación. una representación matemática singular:objeto, un proceso o de la computación, vez El análisis y optimización del Modelar significa encontrar tráfico de las redes de comunicación e Internet.que las simulaciones numéricas computacional, para un un sistema no mencionemos varios instrumentos consultar más importantemejor idea de los problemas reales¿Cómo alocar que se resuelven física, biomecánicafinancieros típicamente grandes y, esta cienciaestructura matemática ecuación. Para tener es necesario construir una que juegauna teoría o en el mundo actual.arte, animación clásica, en Argentina esenciales. El en empresas inversiones ense aplican ya en: útily Primero matemático, construyendo que incorpora sus características es computacionales anatomía, por nombrar sólo minimizando (CIMEC) eventualmente, la página Web del de tipo matemático, permite obtenerde Santa Fé acerca del proceso algunos campos. Los Mecánica Geometría computacional: ingeniería Computacional resultadosel riesgo? modelo construido, Centro de de imágenes. en cuestión. La mallas de resolución discreta de compresión y tratamiento Los cálculos son tan extensos en algoritmos dependen fuertemente35 técnicas de computacional,alrededor del objeto Estudio por Elementos lamodificar odiseño, análisis de imágenes. ecuación crear que el análisis debe estadística, determinada computación científica, efectuarse procesamientoforma ¿Cómo una proteína o de combustión nuevos modelos y/o Finitos una enzima toma una (geometría de computacional, computacionales de Identificación de patrones endesistemas masas la datos. a manera matemática una cirugía La capacidadsirve la grandes aplicación de en lasimbólica la conviertende control, molécula? de la matemáticaanimación molecular? sistemasinterna sitios activos enherramienta para modelar de realidadcon ¿dóndedisciplinas? enla y de otras álgebra lineal,de tensiones señales, matemática... ¿Quéno lineal: hay en matemática de la para cálculo ¿Cómoejemplos de Otros másoperaciones matemática Visualización y de Argentinacomputarizada teoría en aplicada? ¿Qué sucede aplicada? Control métodos Modelos están los CAD). indispensable para la comprensión de los objetos y procesosalto estudio. Por más que se crea que la de rendimiento y en parelelo. http://www.cimec.org.ar computacional’.resultados sin “...en geometría poder predecir Actualmente, los modelos se simulan en computadoras de manera de mecánicos y eléctricos. resolución. ocular:

//Si TL es NULL => no tiene ningun hijo

vert = vert->BL; vert = vert->TL; vert = vert->BR; vert = vert->TR;

}

Geometría Computacional

II.1 Introducción a la Gráfica por Computadoras
La pantalla de nuestro computador puede funcionar en dos modos, modo texto (o alfanumérico) en el que se representan caracteres, y en modo gráfico, en el cual además de caracteres se pueden representar imágenes. Cuando hablamos de modos gráficos, la unidad representable es el pixel. Un pixel (un punto) es la unidad mínima de información que podemos representar en pantalla. El elemento que determina tanto la resolución como la cantidad de colores que podemos representar, es el adaptador. Cada adaptador tiene unas características determinadas, que hace que la forma de programar sea distinta para cada uno. La diferencia fundamental es la manera de gestionar la memoria. La información de un pixel, se almacena en código binario. Esta información hace referencia al color y atributos especiales. Los registros de las tarjetas constituyen el dispositivo de Entrada/Salida (E/S) de más bajo nivel de los adaptadores gráficos. Es en ellos donde se almacena la información relativa a como debe el computador representar los datos en la pantalla. Están conectados a puertos de E/S que los hacen accesibles, permitiendo su modificación y lectura. Una tarjeta de video esta formada por varios controladores hardware integrado en una misma placa. Cada uno de estos controladores tiene a su vez una serie de registros asociados. A la hora de programar las tarjetas gráficas, tendremos que acceder a estos registros, para lo cual se emplea un índice de puerto o index port. Un mismo controlador puede controlar más de un registro, por lo que la finalidad de este índice es señalar cuál de todos los registros es el que se modificará. El modo de acceder a cada controlador es distinto, la forma de leer o escribir en los registros será diferente en cada caso. La aparición de la tarjeta de video VGA (Video Graphic Array) como en el año 1987, hizo que se convirtiera en un estándar de los computadores IBM y compatibles. La VGA tiene una resolución máxima de 640x480 pixeles y puede mostrar simultáneamente un máximo de 256 colores. Esta resolución es muy alta comparada con las antiguas tarjetas CGA y EGA. Lamentablemente para usar los 256 colores solo se puede usar una resolución de 320x200 pixeles. Este modo de vídeo es el conocido Modo 13h, en el cual se han programado la mayoría de los juegos, demos, aplicaciones gráficas, etc. Este modo es uno de los más usados en la programación gráfica, debido a su facilidad de uso y rapidez. Las tarjetas VGA tienen normalmente un mínimo de 256 Kb, estando la memoria dividida en 4 segmentos o planos. Existe un bit, que puede estar a 1 o 0. En el primer caso (bit a 1) hablamos de modos lineales, limitados a un plano. Cuando el bit está a 0, fuerza a usar

36

Geometría Computacional los cuatro planos, por lo que estamos en el caso de los modos denominados planares. Este bit se denomina CHAIN-4, porque encadena los cuatro planos. La denominación chained (modos lineales) y unchained (modos planares), hacen referencia al estado de este bit, indicando que esta a 1 o 0, respectivamente. Los registros de estas tarjetas pueden ser, de lectura, de escritura, o de lectura/escritura. Las tarjetas SVGA tienen cada una de ellas su conjunto de registros. El inconveniente que presentan estas tarjetas, es que aparecen problemas de compatibilidad. No estaremos seguros de que todos nuestros programas que desarrollemos funcionen correctamente con todas las tarjetas. Este problema se puede evitar si nos limitamos a utilizar el conjunto de registros de la VGA, con los que la SVGA son perfectamente compatibles.

La de Colores

Paleta

37

si queremos que el color 0 sea negro entonces utilizamos los valores (0. que es el que el monitor utiliza para representar el color de un pixel. Así tenemos que un color está formado por tres colores básicos. que control un chip llamado DAC (Digital Analog Converter). desde el 0 (más oscuro) hasta el 63 (más claro). o por ejemplo cuando cargamos una imagen. 0. Green. Pero como podemos cambiar los colores. pero solo podremos representar simultáneamente 256. 63).Geometría Computacional Ahora veremos como funciona la paleta de colores. Veamos un ejemplo. Si queremos conseguir un color gris bastará con poner los valores RGB a la misma intensidad cada uno. una haz rojo. o si queremos que sea blanco colocamos los valores (63. 144 (64^3) diferentes. los cuales apuntan a una sola posición que es lo que conocemos como el haz de electrones. cuya misión es la de transformas las 38 . Cada color se consigue a basa de mezclar tres componentes para ir consiguiendo así diferentes tonalidades. o sea. 0. Blue). para así conseguir hacer efectos de paleta. Vamos empezar viendo como funciona lo de la paleta de colores. que también es necesario poner la paleta de esa imagen. pero estos lo encontraras en la sección de efectos (hacer link). 63. verde y azul. Como ya sabemos en el modo 13h disponemos de una paleta de 8 bits. Estos tres colores pueden tener un máximo de 64 tonalidades. Y si lo que queremos es que sea de color rojo intenso ponemos (63. otro verde y uno azul. 256 colores. 0). y mezclándose se consigue crear el color deseado. para poder cambiar nosotros mismos los colores y así poder personalizarnos un programa. ya que la profundidad es de 8 bits y lo máximo que podemos representar en un byte es el valor 255 (0-255). el rojo. 0) y así se puede jugar con los valores. Esto es así porque el sistema que se utiliza es el denominado RGB (Red. bueno como dije antes el chip encargado de esta tarea es el DAC o Digital Analog Converter. A continuación les muestro los valores de algunos colores comunes: Con unos cálculos podemos ver que el numero total de tonalidades disponibles es de 264. ya que este posee tres haces de luz.

y luego. char g. Y si lo que queremos es cambiar los valores RGB de un determinado color. y después enviar los valores RGB al puerto 3C9h. color). char r. outportb(0x3C9. A continuación veremos las rutinas correspondientes en C. que corresponderán a los valores RGB del color número x que indicamos en el puerto 3C7h. obtener y leer tres valores del puerto 3C9h. outportb(0x3C9. Para acceder a este chip y olvidarnos de la BIOS la cual dispone de funciones para trabajar con la paleta. Estos registros son el 03C7h. lo que haremos será primero enviar al puerto 3C8h el número del color a cambiar. el 03C8h y el 03C9h. el número de color del que queremos obtener los 3 valores. void SetColor(unsigned char color. a través de los cuales podremos leer y escribir las diferentes componentes de los colores. primero. para cambiar y leer los valores RGB de un color determinado.Geometría Computacional señales digitales del computador a señales analógicas que utiliza el monitor. 39 . lo que tendríamos que hacer es. g). char b) { outportb(0x3C8. En el siguiente cuadro podrás encontrar la descripción detallada de cada uno: Como vemos. enviar al puerto 3C7h. para leer el valor actual de un color. nosotros usaremos tres puertos. r).

de esta forma. *b=inportb(0x3C9). o incluso se podría crear un tipo de dato llamado t_paleta. y por cada uno ir cambiando las intensidades RGB correspondientes. } Lo que se hace aquí es recorrer los 256 colores. pal[(i*3)+1]. pal[i*3]. } Y para leer los valores RGB de un color. color). pal[(i*3)+2]). cuando queramos crear una variable que guarde la paleta.Geometría Computacional outportb(0x3C9. simplemente la declararíamos así: t_paleta pal. Y por último la rutina para obtener una paleta: void GetPal(t_paleta pal) 40 . char *g. para así hacer mas fácil las declaraciones de paletas en los programas que realicemos. *g=inportb(0x3C9). esto sería así: typedef char t_paleta[768]. i<256. ahora veremos como serían las rutinas para cambiar o obtener una paleta. La rutina modificar la paleta sería así: void SetPal(t_paleta pal) { int i. en este caso llamada pal. i++) SetColor(i. char *b) { outportb(0x3C7. Antes de esto debemos crear una estructura que nos permita guardar las paleta. se haría así: void GetColor(unsigned char color. esto simplemente se puede hacer utilizando un arreglo de tamaño 768 (256*3) y se podría declarar de la siguiente manera: char paleta[768]. *r=inportb(0x3C9). } Ya sabemos cambiar los colores. b). char *r. for(i=0.

Cuando llamamos a la rutina GetColor debemos pasarle los valores RGB por referencia.h> int gdriver = DETECT. i++) GetColor(i. } En esta rutina se hace simplemente lo contrario a la rutina SetPal. aunque si se realiza lo siguiente saldrán como no definidos todas las funciones de la librería grafica ya que es necesario inicializarla en OPTIONS del menú del turbo C dentro de OPTIONS seleccionaremos LINKER y en esta seleccionaremos LIBRARYES y colocaremos una X en donde aparezca Graphics Library y después le damos a OK! . for(i=0. Aunque con las dos líneas anteriores de código es puede inicializar de otras formas con más líneas de código pero esta es una de las más simples si la dirección de los bgi es otra será necesario cambiarla por la que corresponda.Geometría Computacional { int i. &pal[(i*3)+2]). gmode.//Inicialización del modo grafico initgraph (&gdriver. #include<graphics. &gmode. Otra forma más común pero más larga y que aparece en los ejemplos del turbo C es la siguiente (para dibujar un circulo en el centro de la pantalla). para que de esta forma salgan modificados. y por cada uno vamos obteniendo las intensidades RGB de cada color. Lo que haría en realidad la rutina GetPal sería obtener la paleta activa que se encuentra en el sistema. es decir la dirección. Nuevamente recorremos los 256 colores.h Es suficiente con incluir la librería grafica y con colocar las siguientes líneas dentro de la función main. II. &pal[i*3].2 Librerías Gráficas C/ graphics. 41 . &pal[(i*3)+1]. "c:\\tc\\bgi"). i<256. errorcode. con lo cual ya tenemos habilitada la librería gráfica.

h FUNCION SETBKCOLOR 42 .h> #include <stdlib. } II. midy.h> #include <conio. ""). radius). /* Dibuja un circulo */ circle(midx. grapherrormsg(errorcode)). /* Inicializa las variables locales y los graficas */ initgraph(&gdriver. getch(). printf("Presionar una tecla para salir:"). int radius = 100. midy = getmaxy() / 2.h> #include <stdio. closegraph(). getch().1 Funciones de las Librerías Gráficas • Graphics. /* Codigo de error */ } midx = getmaxx() / 2. return 0. /* Lee el resultado de la inicialización */ errorcode = graphresult(). &gmode. int midx. setcolor(getmaxcolor()). exit(1). gmode.2. if (errorcode != grOk) /* Si ocurre algún error */ { printf("Error grafico: %s\n".h> int main(void) { /* Requiere auto detección */ int gdriver = DETECT.Geometría Computacional #include <graphics. midy. errorcode.

este valor puede cambiar con una llamada a la funcion setbkcolor.h> void main () { int adap=DETECT.h> #include <dos.h> #include <dos. Ejemplo: #include <stdio.50). } FUNCION GETBKCOLOR Int getbkcolor (void). El color de fondo. initgraph(&adap.h> 43 . por defecto. Ejemplo: #include <stdio. restorecrtmode(). setbkcolor(4). circle(300.h> #include <graphics. Existen varios valores para ciertos colores de fondo. La funcion setbkcolor no retorna ningún valor.modo. es el color 0. getch(). Esta función es usada para asignar el color de fondo especificado por el argumento color.h> #include <conio.150. Esta función es usada para obtener el valor del color de fondo actual."C:\\tc20\\bin ").Geometría Computacional void setbkcolor (int color). getch(). Sin embargo.h> #include <conio.&modo. La función getbkcolor retorna el valor del color de fondo actual. Existen varios valores para ciertos colores de fondo.

el valor de esta es WHITE.50). setbkcolor(6). circle(300. getch(). Esta funcion no devuelve ningún valor.150. initgraph(&adap. getch(). setcolor(1).modo. circle(300.color). restorecrtmode().h> #include <graphics. } 44 .50).modo.150. todo lo que dibuje después de esta instrucción tendra el color establecido por la funcion setcolor.color. printf("el color de fondo es:%d\n"."C:\\tc20\\bin ").&modo. restorecrtmode(). } void setcolor (int color) Esta función coloca el atributo color es decir escoge un color entre 0 y 15 su equivalente en ingles. color=getbkcolor().Geometría Computacional #include <graphics.h> void main () { int adap=DETECT. Ejemplo: #include <stdio.h> #include <conio.&modo."C:\\tc20\\bin "). getch().h> #include <dos. initgraph(&adap.h> void main () { int adap=DETECT.

relleno.200. cleardevice().h> #include <conio. getch()."C:\\tc20\\bin "). Esta funcion es usada para despejar la pantalla grafícala funcion cleardevice Usa el color de fondo actual. getch(). como es establecida por la funcion setbkcolor . getch().h> void main () { int adap=DETECT. circle(300.h> #include <dos. restorecrtmode(). closegraph().relleno.20).modo. } Funcion getmaxx: 45 .80). initgraph(&adap. para rellenar la pantalla.h> #include <graphics. setlinestyle(SOLID_LINE. circle(400. Ejemplo: #include <stdio. La posición del cursor grafico es la esquina superior izquierda de la pantalla posición (0.200. La funcion cleardevice no retorna ningún valor. relleno=1. setbkcolor(color).0) después de que la pantalla haya sido borrado.THICK_WIDTH).THICK_WIDTH). color=1.&modo.relleno.color.Geometría Computacional FUNCION CLEARDEVICE (VOID) void cleardevice (void). setlinestyle(SOLID_LINE.

Ejemplo: #include <stdio.modo.h> #include <dos. printf("x máxima:%d\n".Geometría Computacional Int getmaxx(void). Esta función es usada para obtener la coordenada máxima de al pantalla en la dirección horizontal. } FUNCION GETMAXY: Int getmaxy(void).&modo.x_max). Este valor suele ser la resolución vertical máxima menos 1. initgraph(&adap. Este valor suele ser la resolución horizontal máxima menos 1 La función getmaxx retorna la coordenada máxima de la pantalla en la dirección vertical. getch().h> #include <graphics. x_max=getmaxx().h> void main () { int adap=DETECT. Esta función es usada para obtener la coordenada maxima de la pantalla en la dirección vertical.x_max. 46 . closegraph().h> #include <conio."C:\\tc20\\bin ").

y_max). El primer relleno de polígonos. busca desde un punto inicial llamada la semilla en todas las direcciones para encontrar una frontera que se encierre la regional frontera se reconoce como el valor del píxel que tiene. initgraph(&adap. x_max=getmaxx().h> void main () { int adap=DETECT.h> #include <dos."C:\\tc20\\bin "). 47 . Turbo C utiliza dos métodos para definir la región de relleno. x_max.h> #include <conio. usa la lista de vértices del polígono para calcular la geometría del interior.&modo. y_max=getmaxy(). getch().Geometría Computacional La funcion getmaxy retorna la coordenada maxima de la pantalla en la dirección vertical.modo. Ejemplo: #include <stdio. closegraph().x_max. el segundo relleno es por el método de inundación. printf ("x máxima: %d\ty máxima: %d\n". } RELLENOS: Es el proceso de rellenar una región de la pantalla con un patrón o color.y_max.h> #include <graphics.

modo. pero es rellenada con la trama de relleno Actual y el color de relleno como es establecido por la funcion setlinestyle. Ejemplo: #include <stdio. Similarmente. x=20.fill. int inf). FUNCION BAR void bar (int izq. 48 . color=1.h> #include <dos.h> #include <graphics. Esta función dibujara una barra rectangular y rellenada de dos dimensiones.&modo. int sup. La barra no tiene borde. La funcion bar no retorna ningún valor. los argumentos derecha e inferior definen la esquina inferior derecha de la barra.x. int der.h> #include <conio. initgraph(&adap. y=20."C:\\tc20\\bin ").La Esquina superior izquierda de la barra rectangular esta definida por los argumentos izquierda y superiores estos argumentos corresponden a los valores x e y de la esquina superior izquierda.h> void main () { int adap=DETECT.Geometría Computacional Antes de estudiar los dos métodos estudiaremos la funcion setfillstyle que sea de gran importancia a la hora de realizar los dos tipos de rellenado y bar que es una funcion similar a rectangle.color.y.

En su lugar. do{ setfillstyle(fill. color=(color+1) % 16.Geometría Computacional fill=1.y. Esta función es usada para seleccionar una trama predefinida y un color de relleno. Existen trece valores ya definidos para tramas.h> 49 . }while(x<620). x+=40. getch(). La función setfillstyle no retorna ningún valor. closegraph(). } FUNCION SETFILLSTYLE: void setfillstlyle (int trama. se debería usar la función setfillpattern. la trama (valor 12) no debería usarse para asignar una trama definida por el usuario. Sin embargo. int color). Ejemplo: #include <graphics.color). fill=(fill+1) % 12.320).x+40. y+10. bar(x. mientras que el argumento color especifica el color de relleno. El argumento trama específica la trama predefinida. getch().

int color). El argumento *trama apunta a una serie de ocho bytes que representa una trama de relleno de bits de 8 x 8. 50.Geometría Computacional #include <conio. bar( 50.modo = EGAHI. donde cada bit está encendido o no (1 ó 0). Cada byte representa una fila de ocho bits. } FUNCIÓN SETFILLPATTERN void setfillpattern (char *trama. setfillstyle( LTSLASH_FILL. La función setfillpattern no retorna ningún valor. Un bit de 0 indica que el píxel correspondiente será asignado el color de relleno actual. initgraph( &driver. /* Pausa */ closegraph(). Ejemplo: #include <graphics.h> void main () { int driver = EGA. El argumento color específico el color de relleno que será usado para la trama. &modo. Esta función es usada para seleccionar una trama de relleno definido por el usuario. getch().h> 50 . 6 ). "c:\\tc20\\bin" ). 350. 300 ). Un bit de 0 indica que el píxel correspondiente no será alterado.

0xF0. "C:\\tc20\\bin" ). 260). 9 ). 0xF0. y así sucesivamente. initgraph( &driver. Al contrario que la función drawpoly. setfillpattern( trama2. 0xEE }.modo = EGAHI.Geometría Computacional #include <conio. char trama2[8] = { 0x0A. bar( 160. Esta función es usada para crear un polígono rellenado. 4 ). 0x0A }. 0xF0. 205. setfillpattern( trama1. respectivamente. 51 . 0xEE. /* Pausa */ closegraph(). 150 ). 50. 0x33. El argumento numpuntos es usado para definir el número de puntos en el polígono. El argumento *puntos apunta a un array de números de longitud numpuntos multiplicado por 2. 150. getch(). 260. 150 ). 0xEE. la función automáticamente cierra el polígono. 0xF0. &modo. Los dos primeros miembros del array identifica las coordenadas x e y del primer punto. 0xEE. bar( 50. el polígono es rellenado con la trama de relleno y color de relleno actuales. 0x0A. mientras que los dos siguientes especifican el siguiente punto. bar (105. int *puntos). Luego. 160. 0x0A.h> void main() { int driver = EGA. La función fillpoly dibuja el perímetro del polígono con el estilo de línea y color actuales. char trama1[8] = { 0x33. } RELLENO POR MEDIO DE UN POLÍGONOS : void fillpoly (numpuntos. 0x33. 0x33. 50.

getch().modo = EGAHI. 50. puntos ). fillpoly( 3.h> #include <conio. 300. trama = SLASH_FILL. } getch(). int puntos[6] = { 300. color.h> #include <stdio.trama. Ejemplo: #include <graphics. /* Pausa */ closegraph(). } /*Este programa te muestra los diferentes colores con una misma trama trata de modificarlo para que obtengas todas las tramas con todos los colores*/ 52 . 500. color ).Geometría Computacional La función fillpoly no retorna ningún valor. &modo.h> void main() { int driver = EGA.color++) { setfillstyle( trama. "C:\\tc20\\bin" ). 300 }. initgraph( &driver. for(color=0.color<=15. 100.

/*verde*/ drawpoly( 4.h> #include <conio. el interior será rellenado. 300.Geometría Computacional RELLENO POR EL MÉTODO DE INUNDACIÓN: void floodfill (int x. 100. int borde). puntos ). El argumento borde especifica el valor del color del borde del área. int y. "C:\\tc20\\bin" ). trama = SLASH_FILL.trama. 300.h> void main() { int driver = EGA. int puntos[8] = { 300. el exterior será rellenado. setcolor( 10 ). Ejemplo: #include <graphics. Los argumentos x e y especifican el punto de comienzo para el algoritmo de relleno.color++) { 53 . Esta función es usada para rellenar un área cerrado con el color de relleno y trama de relleno actuales.modo = EGAHI. Cuando el punto especificado por los argumentos x e y se encuentra dentro del área a ser rellenada. 300. Para que la función fillpoly Funcione como es esperado. 50 }. 50. &modo.h> #include <stdio. Si se encuentra fuera del área. Nota: Esta función no Funciona con el driver IBM-8514. for(color = 0. 500.La función floodfill no retorna ningún valor.color<=15. color. el área a ser rellenado debe estar rodeada por el color especificado por el argumento borde. initgraph( &driver.

Geometría Computacional setfillstyle( trama."c:\\tc20\\BIN"). getch().modo. }while(!kbhit()).h> #include<conio. /* Pausa */ closegraph (). initgraph(&adaptador. getch(). closegraph(). } getch(). do{ mver(). Void mver(void) La función mver muestra el puntero del ratón no es necesario en viar ningún parámetro.h> void main(){ int adaptador=DETECT. floodfill( 400. } • MOUSE.H Todas la librerias aquí explicadas aparecen el la carpeta include de turbo C de tc20. } 54 . 250. La función mver no retorna ningún valor.&modo. color ). Ejemplo #include<graphics. 10 ). Para comenzar tenemos: La función mver().h> #include<mouse.

Geometría Computacional

LA FUNCIÓN MOCULTAR
Void mocultar (void) Esta función oculta el puntero del ratón no recibe ni retorna ningún valor. Ejemplo: #include<graphics.h> #include<conio.h> #include<mouse.h> void main(){ int adaptador=DETECT,modo; initgraph(&adaptador,&modo,"c:\\tc20\\BIN"); do{ mver(); mocultar() }while(!kbhit()); closegraph(); getch(); } Al utilizar estas dos funciones obtenemos un efecto del ratón muy vistoso. La función mtest.

VOID MTEST (VOID)
Esta función sirve para testear el ratón en esta no es necesario enviar ningún parámetro retorna: 0 si no esta instalado el ratón, y n si el número de botones del ratón. La función mtest retorna un entero. 55

Geometría Computacional

Ejemplo: #include<graphics.h> #include<conio.h> #include<mouse.h> void main(){ int adaptador=DETECT,modo; initgraph(&adaptador,&modo,"c:\\tc20\\BIN"); do{ mver(); mtest(); }while(!kbhit()); closegraph(); getch(); }

LA FUNCIÓN MXPOS:
Int mposx (int modo) Dice la posición de la coordenada x en la cual se encuentra el ratón. Es necesario enviar un valor para especificar el modo en cual será usado. 1 es para modo gráfico. 8 es para modo texto La función mxpos regresa la posición horizontal de un entero que seria la posición del ratón en x.

Ejemplo: #include <graphics.h> #include <conio.h> #include <mouse.h> #include <stdlib.h> void main(void) { int adaptador=DETECT,modo; int x,y; char *strx, *stry;

56

Geometría Computacional

initgraph(&adaptador,&modo,"c:\\tc20\\bin"); setbkcolor(BLUE); while(!kbhit()) { setfillstyle(SOLID_FILL,BLUE); mver(); x=mxpos(1); y=mypos(1); itoa(x,strx,10); itoa(y,stry,10); outtextxy(100,100,strx); outtextxy(100,120,stry); if(x!=mxpos(1)||y!=mypos(1)) { setcolor(BLUE); outtextxy(100,100,strx); outtextxy(100,120,stry); setcolor(WHITE);} } }

LA FUNCIÓN MYPOS
int mposy (int modo) Dice la posición de la coordenada y en la cual se encuentra el ratón. Es necesario enviar un valor para especificar el modo en cual será usado. 1 es para modo gráfico. 8 es para modo texto La función mypos regresa la posición horizontal de un entero que seria la posición del ratón en y.

Ejemplo: #include <graphics.h> #include <conio.h> #include <mouse.h> #include <stdlib.h> void main(void)

57

while(!kbhit()) { setfillstyle(SOLID_FILL. x. itoa(y.120.10). outtextxy(100.strx). Ejemplo: 58 . int x. itoa(x.stry.strx).100. X: posición horizontal. int x. La función no retorna ningún valor. 8 para modo texto. Modo: 1 para modo gráfico. x=mxpos(1). *stry.120. if(x!=mxpos(1)||y!=mypos(1)) { setcolor(BLUE).BLUE). char *strx.y. Y: posición vertical.stry).} } } LA FUNCIÓN MSITUAR: Void msituar (int modo.&modo. y=mypos(1). outtextxy(100.modo.y."c:\\tc20\\bin"). setbkcolor(BLUE).100. outtextxy(100. outtextxy(100.strx. initgraph(&adaptador.10). mver().Geometría Computacional { int adaptador=DETECT.stry). int y) Esta función permite situar al cursor en una posición específica para su utilización es necesario enviar tres parámetros modo. setcolor(WHITE).

h> #include<conio. y=mypos(1).x.modo. Ejemplo: #include<graphics. /*Coloca el cursor en el centro de la pantalla*/ do{ mver().&modo.h> void main(){ int adaptador=DETECT.310.&modo. }while(!kbhit()). getch()."c:\\tc20\\BIN"). initgraph(&adaptador."c:\\tc20\\BIN").240).Geometría Computacional #include<graphics.y. Retorna 0 si no es presionado ningún botón. 1 si se presionó el botón izquierdo del Mouse. } LA FUNCIÓN MCLICK: Int mclick (void) Nos dice si se ha pulsado un botón del Mouse. 2.modo.h> #include<mouse. if(mclick()==1) { 59 . do{ mver(). closegraph(). msituar(1. initgraph(&adaptador.h> void main(){ int adaptador=DETECT. si se presionó el botón derecho del Mouse.h> #include<conio.h> #include<stdlib. x=mxpos(1). no es necesario enviar un parámetro.h> #include<mouse.

} LA FUNCIÓN MLIMIT Void mlimit (int modo. closegraph(). } delay(10000). setcolor(BLACK)."Diste un click derecho"). outtextxy(x+30.y.y. outtextxy(x+30."Diste un click izquierdo").x1. } if(mclick()==2) { setcolor(RED). outtextxy(x+30."Diste un click derecho").y. outtextxy(x+30.Geometría Computacional setcolor(GREEN). }while(!kbhit()). int ) . X1: límite de arriba. en esta función es necesario enviar cinco parámetros modo. X2: limite de abajo Y2: límite de la derecha Estas coordenadas formarán un rectángulo el cual será el límite hasta donde podrá llegar el ratón. Y1: límite abajo. Modo: 1 para modo gráfico. getch().y1. 8 para modo texto. Esta función limita el espacio de movilización del cursor (ratón)."Diste un click izquierdo").y.x2. 60 .y2.

X2: limite de abajo Y2: límite de la derecha Retorna 1 si esta en esa área en caso contrario regresará 0 (cero).500. initgraph(&adaptador.Geometría Computacional Ejemplo: #include<graphics.400)."c:\\tc20\\BIN"). Modo: 1 para modo gráfico. mver(). closegraph(). inty1.h> void main(){ int adaptador=DETECT. do{ outtextxy(100.h> #include<conio.100. mlimit(1.h> 61 .&modo.50. rectangle(100. Y1: límite abajo. int y2) Esta función verifica si el ratón se encuentra en un área determinada para la implementación de ésta función es necesario enviar cinco parámetros.400).h> #include<mouse.100. getch(). }while(!kbhit())."Dibuja‚ el rectángulo para que observaran el limite").100. int x1. 8 para modo texto. int x2.h> #include<conio. Ejemplo: #include<graphics. } LA FUNCIÓN MINLIMIT void minlimit(int modo. X1: límite de arriba.modo.500.

outtextxy(310. outtextxy(210.100.modo.120). setcolor(BLACK). } }while(!kbhit()).200.&modo. } 62 . rectangle(100."c:\\tc20\\BIN")."Haz pulsado el rat¢n por encima del bot¢n"). getch(). initgraph(&adaptador.200."pasa el mouse por encima del bot¢n y veras el efecto"). delay(30000).100.Geometría Computacional #include<mouse.240.120)==1) { outtextxy(310.100.105. mver(). do{ setcolor(WHITE). if(minlimit(1. closegraph().h> void main() { int adaptador=DETECT. setbkcolor(BLUE)."Haz pulsado el rat¢n por encima del bot¢n").240.

coloreado o transferido de la imagen. o pueden se una operación tal como relleno.3. donde se definen los vértices del polígono a ser rellenados la segunda es una operación grafica que busca algorítmicamente las fronteras de la función de relleno. 63 . o circulo. polígonos.1 ¿Qué son los primitivos gráficos? Definición: Un primitivo grafico es un elemento fundamental de dibujo en un paquete grafico tal como un punto. líneas.Geometría Computacional II. pueden ser un carácter. etc. Figuras Geométricas: Dibujan las figuras de geometría clásica: círculos. Relleno: Tiene dos formas de realizarse.3 Primitivos Gráficos II. El primero es con polígonos. rectángulos. línea. arcos. C cuenta con cinco grupos de primitivos gráficos.

el grosor y el color actual. El primer punto es especificado por los argumentos x1 e y1.Geometría Computacional Rasterop: Es una operación grafica que copia el área de una imagen para luego dibujarla en cualquier región de la pantalla. Esta función es usada para conectar dos puntos con una línea recta. La posición del cursor actual grafico no es afectada por la función line.h> #include <graphics. utilizando diferentes fuentes.3. int x2. int y2). El segundo punto es especificado por los argumentos x2 e y2.2 FIGURAS GEOMETRICAS LINEAS void line (int x1. Texto Grafico: Sirve para escribir texto en modo grafico.h> 64 . Ejemplo: #include <stdlib.h> #include <conio. La función line no retorna ningún valor. int y1. II.La línea se dibuja usurado el estilo de la línea actual. Graficas Matemáticas: Dibuja los primitivos barras y sectores para conseguir dibujar las herramientas del sector.

Los argumentos x e y definen el centro del circulo.getmaxy()/2). closegraph()."C:\\tc20\\bin "). int t.getmaxx()/2. line(0. getch (). int radio). } CIRCULO void circle(int x.Geometría Computacional #include <stdio. 65 .&modo. mientras que el argumento radio define el radio del circulo.modo. El círculo no es rellenado pero es dibujado usando el color actual. sin embargo. el estilo de la línea es ignorado por la funcion circle.h> void main () { int adap=DETECT. Esta función se utiliza para dibujar un círculo. La funcion cirlce no retorna ningún valor. initgraph(&adap. El grosor de la circunferencia puede ser establecido por la funcion setlinestyle.0.

Estos argumentos corresponden a los valores x e y de la esquina superior izquierda.Geometría Computacional Ejemplo: #include <stdlib.modo.200.&modo.80). int derecha. 66 . initgraph(&adap.h> #include <graphics.h> void main () { int adap=DETECT. La esquina superior izquierda del rectángulo esta definida por los argumentos izquierdos y superiores."C:\\tc20\\bin "). int superior. closegraph(). int inferior). } RECTANGULOS void rectangle(int izquierda.h> #include <stdio. los argumentos derecha e inferior definen la esquina inferior derecha del rectángulo. El perímetro del rectángulo es dibujado usando el estilo y el grosor de líneas actuales. Similarmente. getch(). circle (300. Esta funcion dibujara un rectángulo sin rellenar su interior usando el color actual.h> #include <conio.

&modo. pero es dibujado usando el color actual .Geometría Computacional La funcion rectangle () no retorna ningún valor. y es dibujado con el radio especificado: radio. int final_angulo.h> #include <graphics. rectangle(40.400. El arco comienza al ángulo especificado por el argumento comienzo_angulo y 4es dibujado en las dirección contraria al de las agujas del reloj hasta llegar llegar al ángulo especificado por el argumento ángulo por el final. closegraph().300). int radio).h> void main () { int adap=DETECT. } ARCOS void arc(int x. El arco tiene como centro el punto especificado por los argumentos x e y.h> #include <stdio. initgraph(&adap. getch(). La función arc Saa el 67 .modo. Esta función creara un arco circular.40."C:\\tc20\\bin "). El arco no esta rellenado. int comienzo_angulo.h> #include <conio. Ejemplo: #include <stdlib. int y.

h> #include <graphics.radio<254. ignorara el argumento trama de la función setlinestyle. } } PIXELES 68 .240. closegraph(). for (radio=200. getch().h> #include <stdio.45. initgraph(&adap.Geometría Computacional este (extendiéndose hacia la derecha del centro del arco en la dirección horizontal como su punto de 0 grados."C:\\tc20\\bin ").h> void main () { int adap=DETECT.&modo. La fusión arc sin embargo. La función setlinestyle puede usarse para establecer el grosor del arco.h> #include <conio. Ejemplo: #include <stdlib.radio +=200) { arc(320. La función arc no retorna ningún valor.radio.150.modo.radio).

h> #include <conio. getch().RED).Geometría Computacional void putpixel(int x. El argumento color específico.t. for (t=0.50+t."C:\\tc20\\bin ").h> #include <graphics.&modo. int y. } } 69 . initgraph(&adap.t++) { putpixel(100+t. int color). La función putpixel no retorna ningún valor.t<200.modo.h> #include <stdio. Ejemplo: #include <stdlib.h> void main () { int adap=DETECT. el valor del color. Esta función es usada para conectar a un píxel en una posición en particular la cual es cuestionada por los argumentos x e y . closegraph().

Geometría Computacional

ELIPSES:
void ellipse ( int x, int y, int comienzo_angulo, int final _ ángulo, int x_radio, int y_radio) ;

Esta función es usada para dibujar un arco elíptico en el color actual. El arco elíptico esta centrado en el punto especificado por los argumentos x e y. Ya que el arco es elíptico el argumento x_radio especifica el radio horizontal y el argumento y_radio especifica el radio vertical .El arco elíptico comienza con el ángulo especificado por el argumento comienzo_angulo y se extiende en un sentido contrario a las agujas del reloj al ángulo especificado por el argumento final_angulo. La función ellipse considera a este el eje horizontal a la derecha del centro de la elipse ser 0 grados . El arco elíptico es dibujado con el grosor de línea actual con esta establecida por la función setlinestyle. Sin embargo, el estilo de línea es ignorado por la función elipse. La función ellipse no retorna ningún valor.

Ejemplo: #include <stdlib.h> #include <conio.h> #include <graphics.h> #include <stdio.h> #include <mouse.h> void botonUP(void); void main () { int adap=DETECT,modo; initgraph(&adap,&modo,"C:\\tc20\\bin "); mver(); botonUP(); 70

Geometría Computacional

getch(); closegraph(); } void botonUP(void) { setbkcolor(7); fillellipse(getmaxx()/2,getmaxy()/2,50,25); setcolor(RED); ellipse(getmaxx()/2, getmaxy()/2,360,180,50,25); setcolor(BLUE); ellipse(getmaxx()/2, getmaxy()/2,180,360,50,25); }

II.4 Funciones para el manejo de Primitivos Gráficos

FUNCIONES DE COORDENADAS RELATIVAS

Entre ellas tenemos las Funciones moveto, moverel, lineto, linerel, getx, gety. Estudiaremos cada una de ellas para afianzar más conocimientos.

FUNCIÓN MOVETO

void far moveto(int x, int y);

71

Geometría Computacional

Esta función es usada para colocar el cursor gráfico al punto especificado por los argumentos x e y. Ya que el cursor es movido desde su posición anterior al punto especificado por los argumentos x e y, no hay dibujo alguno.

La función moveto no retorna ningún valor.

Ejemplo:

#include <graphics.h> #include <conio.h> void main() { int adap,modo; initgraph( &driver, &modo, "C:\\tc20\\BIN" ); moveto( 20, 20 ); lineto( 40, 60 ); lineto( 80, 90 ); getch(); closegraph(); }

FUNCIÓN LINETO

void far lineto (int x, int y);

72

h> #include <conio. La línea se dibuja usando el estilo de línea actual. "C:\\tc20\\bin" ). getch(). closegraph(). int dy). la posición del cursor gráfico es actualizado a la posición especificado por los argumentos x e y (el punto final de la línea). initgraph( &adap. 90 ). 60 ). Después de que la línea recta haya sido dibujado. moveto( 20. 20 ). &modo. lineto( 40. } FUNCIÓN MOVEREL void moverel(int dx. Ejemplo: #include <graphics.h> void main() { int adap. modo . el grosor. La función lineto no retorna ningún valor. y el color actual. lineto( 80. 73 .Geometría Computacional Esta función es usada para dibujar una línea recta desde la posición actual del cursor gráfico hasta el punto especificado por los argumentos x e y.

20 ). linerel( 40. 40 ). } FUNCIÓN LINEREL void far linerel(int dx. closegraph(). moverel( 50. moveto( 20. getch(). 74 . "C:\\tc20\\bin" ).Geometría Computacional Esta función es usada para mover la posición del cursor gráfico a una distancia relativa como los argumentos dx y dy. 50 ). int dy). 30 ). El argumento dy define la distancia relativa a moverse en la dirección vertical. Ejemplo: #include <graphics. Estos valores pueden ser positivos o negativos. &modo. linerel( 20.h> #include <conio.h> void main() { int driver = DETECT. No se dibuja ya que el cursor es mudado. initgraph( &adap. La función moverel no retorna ningún valor.modo. El argumento dx define la distancia relativa a moverse en la dirección horizontal.

getch(). 40 ). La línea se dibuja usando el estilo de línea actual. 30 ). closegraph(). } 75 . la posición del cursor gráfico es actualizado al último punto de la línea. 20 ). El argumento dy específica el número relativo de píxeles para atravesar en la dirección vertical. Cuando la línea esté terminada.Geometría Computacional Esta función es usada para dibujar una línea recta a una distancia y dirección predeterminadas desde la posición actual del cursor gráfico. Estos argumentos pueden ser tanto valores positivos como negativos. initgraph( &driver. y el color actual desde la posición actual del cursor gráfico a través de la distancia relativa especificada. "C:\\tc20\\bin" ). &modo. El argumento dx específica el número relativo de píxel para atravesar en la dirección horizontal. Ejemplo: #include <graphics. el grosor.h> void main() { int driver = EGA. linerel( 20. La función linerel no retorna ningún valor. moveto( 20. linerel( 40.h> #include <conio.modo = EGAHI.

modo. del cursor gráfico. initgraph( &adap.&modo. El valor retornado especifica el lugar del píxel horizontal del cursor gráfico (la coordenada x).h> #include <stdio. x = getx(). Esta función es usada para obtener la posición. x.h> void main() { int adap. moveto( 300. Ejemplo: #include <graphics. La función getx retorna la coordenada x del cursor gráfico. "C:\\tc20\\BIN" ). closegraph(). en la dirección horizontal. y. x. 150 ). relativo a la pantalla del usuario actual. y = gety(). y). } 76 .Geometría Computacional FUNCIÓN GETX int getx(void). printf (“Cursor gráfico\n\nX: %d\tY: %d\n".

initgraph( &adap. getch(). en la dirección vertical. printf (“Cursor gráfico\n\nX: %d\tY: %d\n".h> void main() { int adap. Esta función es usada para obtener la posición. &modo. relativo a la pantalla del usuario actual. } 77 .Geometría Computacional FUNCIÓN GETY int far gety(void). “C:\\TC20\\BIN” ). y = gety(). y). 150 ). modo. La función gety retorna la coordenada y del cursor gráfico. Ejemplo: #include <graphics. El valor retornado especifica el lugar del píxel vertical del cursor gráfico (la coordenada y). moveto( 300. x. x = getx(). del cursor gráfico. closegraph(). x. y.h> #include <stdio.

int derecha. son aquellas que realizar la acción de mover una imagen ya sea transportando una imagen o copiándola. Procederemos a explicar cada una de ellas para realizar buestros ejercicios de movimiento. Los argumentos izquierda y superior definen las coordenadas x e y de la esquina superior izquierda de la imagen rectangular.int superior. los argumentos derecha y inferior definen las coordenadas x e y de la esquina inferior derecha de la imagen rectangular. int inferior). Las funciones pertenecientes al rasterop son: imagesize malloc getimage putimage Las cuatro complementan la operación de mover una imagen almacenándola en una variable temporal de tipo buffer. FUNCIÓN IMAGESIZE unsigned far imagesize(int izquierda. Esta función es usada para determinar el tamaño del búfer necesitado para almacenar una imagen con la función getimage.Geometría Computacional Funciones de Rasterop Las funciones del rasterop. 78 . Similarmente.

50. int imagentam. el valor retornado es 0xFFFF. initgraph( &adap.h> #include <conio. bar( 50. 100. 350. 100 ).h> #include <stdlib. ó -1. “C:\\tc20\\BIN” ).Geometría Computacional La función imagesize retorna el número actual de bytes necesarios. getch(). Si esto no es el caso. } /*En este ejercicio solo calculamos el tamaño de la imagen*/ FUNCIÓN MALLOC void *malloc(size_t size) 79 .h> #include "stdio.h" void main() { int adap=DETECT. 300 ). closegraph(). &modo. si el tamaño requerido es menor que 64 Kb menos 1 byte. 50. void *imagen. imagentam = imagesize( 50. Ejemplo: #include <graphics. int modo = EGAHI. setfillstyle( SLASH_FILL. WHITE).

WHITE). getch(). "C:\\tc20\\BIN"). bar( 50. free( imagen ).*/ 80 .h> #include <conio.h. 50. /*int imagentam. 100. &modo. 100 )). 50. Regresa un puntero(indicador)al bloque recientemente asignado.Geometría Computacional Función definida en conio.*/ initgraph( &adap. Si el tamaño==0. 100. 350. 100 ).*/ imagen = malloc(imagesize( 50.h> void main() { int adap =DETECT.h> #include <stdlib. Ejemplo: #include <graphics. setfillstyle( SLASH_FILL. void *imagen. 300 ). int modo = EGAHI. closegraph(). o Nulo (NULL) si no existe suficiente espacio en nuevo bloque. /*imagentam = imagesize( 50. } /* getch(). El tamaño está en bytes. 50. este regresa un Nulo(NULL) .

h> #include <stdlib. void *imagen. respectivamente. Esta función es usada para guardar una porción rectangular de la pantalla para un uso posterior. int inferior. 350. La función getimage no retorna ningún valor. 100. 81 . Estos argumentos definen las coordenades x e y de la esquina inferior derecha. int imagentam. initgraph( &adap. imagentam = imagesize( 50.h> #include <conio.WHITE ). El argumento *image apunta al búfer de memoria donde la imagen está guardada. int derecha. int superior. bar( 50.h> void main() { int adap = DETECT. 50. 50. Ejemplo: #include <graphics. directamente. 300 ). Estos argumentos representan las coordenades x e y de la esquina superior izquierda. La esquina superior izquierda del área rectangular que ha de ser guardada está definida por los argumentos izquierda y superior. &modo. void far *imagen). int modo = EGAHI. "C:\\tc20\\BIN" ). setfillstyle( SLASH_FILL. 100 ). Los argumentos derecha e inferior definen la esquina inferior derecha de la imagen rectangular. respectivamente.Geometría Computacional En este ejemplo calculamos en tamaño de la imagen y el número de bytes necesarios para contenerla FUNCIÓN GETIMAGE void far getimage(int izquierda.

respectivamente. La imagen se coloca en la pantalla con la acción definida en el argumento acción. int acción). 50. Esta función coloca una imagen que fue previamente guardada con la función getimage en la pantalla. getimage( 50. Los valores y consonantes usados por el argumento acción se describen a continuación ya que pudieron haberlos olvidado: Constante COPY_PUT XOR_PUT OR_PUT AND_PUT NOT_PUT Valor 0 1 2 3 4 Significado Sobrescribir los píxeles existentes Operación OR Exclusivo con los píxeles Operación OR Inclusivo con los píxeles Operación AND con los píxels Invertir la imagen La función putimage no retorna ningún valor. 100. 100. getch().Geometría Computacional imagen = malloc( imagentam ). void far *image. Ejemplo: 82 . El argumento *image apunta al búfer de memoria donde la imagen está guardada. } /*En este ejemplo solo conseguimos el tamaño de la imagen y guardamos la imagen en un buffer*/ FUNCIÓN PUTIMAGE void putimage(int izquierda . imagen ). Estos argumentos representan las coordenadas x e y de la esquina superior izquierda. free( imagen ). La esquina superior izquierda donde será colocada la imagen está definida por los argumentos izquierdos y superiores. int superior.

100. initgraph( &adap. imagen.h> #include <stdlib. /* Pausa */ closegraph(). 110. 50. void *imagen. getch(). 50. 50.Geometría Computacional include <graphics. 100 ). setfillstyle( SLASH_FILL. &modo. imagentam = imagesize( 50. getch(). imagentam.h> #include <conio. COPY_PUT ).WHITE ). 100. getch(). putimage( 400. } UNIDAD III: TRIANGULACION DE POLIGONOS 83 . putimage( 400. bar( 50. imagen. 350. "C:\\tc20\\BIN" ).h> void main() { int adap =DETECT. COPY_PUT ). 300 ). free( imagen ). 50. imagen ). 100.modo = EGAHI. getimage( 50. imagen = malloc( imagentam ).

etc. AD. B. BE 6) Perímetro: Es la longitud total de su contorno ó es la suma de sus lados. BC.1 Definición de Polígonos Polígonos es la porción de plano limitada por una línea poligonal cerrada. la prolongación del lado consecutivo. los vértices son: A. Ángulos interiores: Son los ángulos formados por dos lados consecutivos. CD. C. 2) Vértices: Son las intersecciones de dos lados consecutivos. etc. III. 3) 4) Ángulos exteriores: Son los ángulos formados en un vértice por un lado y 5) Diagonales: Son líneas rectas que unen dos vértices no consecutivos. D. AC.Geometría Computacional III.2 Clasificación de Polígonos por la forma de su contorno 84 . DE. Elementos 1) Lados: Son los segmentos rectilíneos que lo limitan: AB.

La suma de los ángulos interiores de un polígono convexo de "n" lados es igual a tantas veces un ángulo llano como lados menos dos tiene el polígono 2da. El valor de un solo ángulo interior de un polígono convexo regular de "n" lados es: 3ra 85 . Regulares: Son los polígonos que tienen sus ángulos y sus lados iguales entre sí. en los que una recta al atravesarlos pueden cortar en más de dos puntos.Geometría Computacional Convexos: Son aquellos polígonos. Cóncavos: Son aquellos polígonos. en los que al atravesarlos una recta lo cortan en un máximo de dos puntos. Propiedades de los polígonos 1ra. Irregulares: Son los polígonos que tienen sus ángulos y lados desiguales. Alabeados: Son los polígonos cuyos lados no están en el mismo plano. Equiángulos: Son los polígonos que tienen sus ángulos iguales. Equiláteros: Son los polígonos que tienen todos sus lados iguales.

pero todo sobre dos.Geometría Computacional La suma de los ángulos exteriores de un polígono convexo es igual a 4 ángulos rectos 4ta El valor de un solo ángulo exterior de un polígono regular convexo de "n" lados es: 5ta La suma de los ángulos centrales de un polígono convexo regular es igual a 4 ángulos rectos 6ta El valor de un solo ángulo central de un polígono convexo regular de "n" lados es: 7ma El número total de diagonales de un polígono es: De cada vértice de un polígono se pueden trazar (n . pues cada diagonal corresponde a dos vértices diferentes 8va 86 .3) diagonales. de los "n" vértices se podrán trazar n(n .3) diagonales.

87 . Los polígonos cóncavos son aquellos que tienen alguno de sus ángulos interiores mayor de 180º. e irregulares. si sus lados y ángulos son iguales. Se clasifican en regulares. Construcción de polígonos Los polígonos son las superficies planas limitadas por rectas que se cortan dos a dos. Las diagonales son las rectas que unen dos vértices no consecutivos.Geometría Computacional La suma de los ángulos interiores de un polígono cóncavo es igual a tantas veces un ángulo llano como lados menos dos tiene el polígono. 9na La suma de los ángulos exteriores de un polígono cóncavo es igual a 4 ángulos rectos.

La intersección de cada par de aristas adyacentes en el orden cíclico es un simple punto compartido entre ellos.Geometría Computacional Segmento de línea Un segmento de línea es un subconjunto cerrado de una línea contenido entre dos Puntos.… en-1 = Vn-1V0. Polígono (Definición matemática) Sean V0. e1= V1V2. V1. V3. para todo i=0. los cuales son llamados puntos finales. ei ∩ ei+1= Vi. entonces estos Segmentos limitan un polígono si y solo si: 1.… n-i 2-) Los segmentos no adyacentes no se intersectan. V2. el subconjunto se dice cerrado en El sentido de que este incluye los puntos finales. para todo i=0 ≠j 88 . ‘n’ segmentos conectando los puntos.… Vn-1. ‘n’ puntos en el plano y sean e0= V0V1. … ei= ViVi+1. ei ∩ ej = Φ.

Geometría Computacional a) V3 e3 V4 e4 e5 V0 e0 V1 V5 e1 e2 V2 V2 V0 V4 b) V3 No se cumple la V1 segunda condición V2 c) e0 ady e1V5 intersección V1 e1 ady e2 intersección V1 V V 4 3 V1 V0 e2 ady e3 intersección V1 e3 ady e4 intersección V1 e4 ady e5 intersección V1 e5 ady e0 intersección V1 La interior no es vacía 89 .

Las dos partes son llamadas el interior y el exterior de la curva. son llamados vértices del polígono Los segmentos ei. son llamados aristas del polígono Un polígono de ‘n’ vértices tiene ‘n’ aristas Teorema: Cada curva cerrada simple (Polígono) divide el plano en dos partes. El exterior es ilimitada El interior es limitada Vértic 6 e 5 3 n = # de vértices Vi = vértices i ei = Arista # Vértices = # de Aristas ∂P (Delta P) = Frontera Del polígono 4 Exterio r 8 7 Interio r 10 0 1 2 ∂P Arist a 9 Etiquetar en sentido antihorario los vértices 90 .Geometría Computacional (b) y (c) No cumplen ambas condiciones por lo tanto se considera como polígonos No simples Cumple ambas condiciones entonces se considera Polígono Simple Notación de un Polígono Puntos Vi.

lo que da lugar a interesantes problemas de iluminación. formas regulares en sus plantas. en general. Mencionemos aquí dos de ellos: Problema de Hadwiger ¿Cuántos reflectores se necesitan para iluminar el contorno exterior de una figura plana. Así se plantea el problema de minimizar el nº de luces que son necesarias para iluminar la sala. Si la planta fuera un polígono convexo.Geometría Computacional III. Figura 1. convexa y de borde liso? Boltyanski probó en 1960 que tres reflectores son siempre suficientes. pero la irregularidad impide esta solución económica. Problema de Strauss 91 . Iluminando distintas salas Los problemas de iluminación han atraído la mirada de los matemáticos desde hace tiempo. una única fuente de iluminación bastaría para iluminar toda la sala. compacta.3 Teorema de la Galería de Arte Hoy en día las salas de los nuevos museos no tienen.

calcular el mínimo nº de guardias que lo vigilan. coloréese con 3 colores el grafo de la triangulación y pónganse los guardias en los vértices coloreados con el color que menos veces aparezca. Se puede interpretar también en términos de vigilancia de una sala poligonal: ¿Cuántos guardias (o cámaras de vigilancia que cubran 360º) son suficientes para vigilar el interior de un polígono de n lados? La respuesta a este problema fue obtenida por Chvátal [Ch] en 1975. Pero la segunda parte de la conjetura permanece abierta. El problema así resuelto es de naturaleza combinatoria pues responde a la generalidad de los polígonos de n lados. La cuestión fue planteada por V. En 1978.Geometría Computacional Pensemos en una sala de planta poligonal cuyas paredes son espejos. ¿Habrá siempre un punto con esa propiedad? Recientemente Tokarsky [To] ha probado que la respuesta a la primera pregunta es negativa. Desgraciadamente no existe ningún algoritmo eficiente que lo resuelva. Volvamos al problema de iluminación de una sala en un museo. Fisk dio una demostración concisa y elegante que ampliaremos más adelante: Triangúlese el polígono. Por ello tiene sentido plantear el siguiente problema algorítmico: Dado un polígono P. pues Lee y Lin [LL] han probado que es un problema de complejidad NP. Sin embargo no todos los polígonos de n lados requieren ese nº de guardias (por ejemplo. ¿Es cierto que basta colocar una fuente luminosa en cualquier punto de la sala para iluminarla completamente?. Klee en 1973 en estos términos: Determinar el mínimo número de puntos de un polígono suficientes para ver a todos los restantes. (Informalmente hablando esto significa que no se conoce ningún algoritmo para resolverlo en que el número de operaciones efectuadas sea un polinomio en el nº de datos de entrada) 92 . cualquier convexo de n lados sólo requiere un guardia). quien demostró que n/3 guardias siempre son suficientes.

vigilan en todas las direcciones y su vigilancia tiene alcance ilimitado. Pero también podemos modificar las características de los guardias o de los focos de luz. Para vigilar una galería de arte poligonal con n vértices. por ejemplo. Permitiendo.Geometría Computacional Tras conocer la respuesta al problema planteado por Klee surgen de modo inmediato multitud de nuevas preguntas: ¿Qué sucede si el objeto a vigilar es un tipo especial de polígono. más general. Diferentes formas de vigilar o iluminar. (Fisk [Fi]) 93 . (n/3) guardias son siempre suficientes. Existen salas que necesitan ese nº de guardias. de una configuración de objetos? Estas preguntas corresponden a variantes del Problema en las que cambia el objeto a vigilar. En este artículo comenzaremos con la demostración de Fisk del denominado Teorema de las Galerías de Arte y presentaremos después algunas de las variantes mencionadas. que los guardias patrullen por segmentos o limitando la amplitud de los focos luminosos tendremos distintas variantes del Problema de las Galerías de Arte. En el problema original los guardias son estáticos. Figura 2. o si se quiere iluminar el exterior del polígono o. Demostración.

Segundo paso. anticipados en la introducción: Primer paso. con interiores disjuntos y cuyos vértices son vértices de P. es decir. descomponemos P en triángulos cuya unión es P. Observamos que un guardia situado en cualquier vértice de un triángulo vigila completamente dicho triángulo. (Triangulación) Triangulamos P. (Coloración) 94 .Geometría Computacional Consideremos un polígono simple P de n vértices y observemos gráficamente los siguientes pasos.

Basta pues. probado en 1976 por Appel y Haken. colocar los guardias en los vértices con el color menos utilizado para garantizar que (n/3) guardias son siempre suficientes para vigilar cualquier polígono de n vértices. vigilarán todos los triángulos y. alguno de los tres colores. a lo más. rojo. Tercer paso. (Una coloración de un grafo es una asignación de colores a los vértices del grafo de modo que dos vértices adyacentes reciben diferente color) En esta 3-coloración de T cada triángulo tiene un vértice de cada color. por tanto. Si colocamos un guardia en cada vértice rojo.Geometría Computacional La triangulación anterior es un grafo plano. negro o azul se utiliza en. basta considerar el polígono "peineta" con n=3k vértices de la Figura 4. sumando los vértices de cada color tendríamos más de n vértices). Figuras de peine ‘k’ puntos = G(n) por cada punto un guarda 95 . El Teorema de los cuatro colores. todo el polígono. Pero podemos colorear los vértices de una triangulación T de un polígono utilizando tan sólo tres colores. uno por cada púa de la peineta. El polígono tiene n vértices y disponemos de 3 colores. asegura que todo grafo plano puede colorearse utilizando sólo cuatro colores. (Colocación de guardias) Cada triángulo de T tiene un vértice rojo. Es fácil observar que para vigilar este polígono se necesitan al menos k guardias. Por tanto. Lo mismo sucederá si colocamos guardias en todos los vértices negros o si los colocamos en todos los vértices azules. Cuarto paso (Necesidad de los (n/3) guardias) Para comprobar que este número de guardias es a veces necesario. (Esto es una aplicación inmediata del Principio del palomar o de Dirichlet: Si cada color se utilizara en más de (n/3) vértices. (n/3) vértices.

b} . tal partición es denominada la Triangulación de un polígono. k= n/3 .Geometría Computacional n=3k . asociando c/ punta con la arista de separación a su derecha y la arista del fondo con la punta mas a la derecha. Si se agregan tantas diagonales no cruzadas a un polígono como sea posible el inferior del polígono es particionarlo en triángulos. Diagonal no cruzada: Dos diagonales son llamadas no cruzadas si su intersección es un subconjunto de sus puntos finales. G(n)= n/3 Un peine consiste de ‘k’ puntas cada punto está compuesta de dos aristas y las puntas adyacentes están separadas por una arista. la intersección del segmento cerrado AB son frontera del polígono. 14 9 13 Diagonales no cruzadas 7 8 12 15 16 11 10 17 19 20 6 5 18 0 2 4 3 1 96 . es exactamente el conjunto {a. Observamos que un peine de ‘k’ puntos tiene n=3k aristas y por lo tanto vértices. ellas no comparten puntos interiores. puesto que c/ punta requiere de su propio guarda entonces establecemos que: G(n) será < n/3 => G(n) < n/3 Definición de una diagonal: La diagonal de un polígono ‘P’ es un segmento de línea entre dos de sus vértices A y B que son claramente visibles uno al otro.

Lema Todo polígono de n vértices. Un polígono simple divide el plano en dos regiones abiertas: una no acotada llamada exterior de P y otra acotada llamada interior de P.Geometría Computacional III. 97 .. Un polígono P es una secuencia cerrada de segmentos y se representa por una secuencia de vértices p = (p0... donde pi tiene unas coordenadas (x.. ***Un polígono es simple si dos aristas no consecutivas no se intersecan. se traza una diagonal cualquiera que descompone el polígono P en otros dos con menor nº de vértices. Por inducción sobre n.. p1.. pn-1). Si n=3. 0 ≤ i ≤ n-1.y).. ¿Esto se puede hacer siempre? ¿Existe siempre una diagonal? La respuesta es afirmativa pero se han publicado varias pruebas incorrectas a lo largo de los años. Si n≥4.pi+1). Supondremos que los vértices vienen dados en el orden de las agujas del reloj. Por hipótesis de inducción cada uno de estos polígonos admite una triangulación lo que proporciona una triangulación de todo P. Los segmentos (pi. admite una diagonal interna. Todo polígono se puede triangular.4 Teoría de Triangulación En primer lugar. El segmento que une dos vértices no consecutivos pi y pj de P se llama diagonal de P si está contenido en P. Una triangulación de un polígono simple está compuesta por n-3 diagonales que no intersecan. Demostración. el polígono ya es un triángulo. definiremos de una manera formal lo que es un polígono.. por lo que el interior del polígono está a la derecha de los vértices. Analicemos la frase: "se traza una diagonal. n≥4. nº de vértices del polígono. son las aristas de P. Propiedad 1.".

Si n=3. antes de decidir qué algoritmo es el más adecuado para nuestro problema. Sea P un polígono y T(P) una triangulación de P. Así AX está contenido en P y es la diagonal buscada. Demostraremos el resultado por inducción sobre n. En primer lugar observamos que todo polígono tiene algún vértice convexo (por ejemplo. (Una de las demostraciones incorrectas pero publicadas toma como diagonal válida el segmento AZ donde Z es el vértice más próximo al punto A. Existen muchos algoritmos para triangular polígonos simples que difieren en las complejidades de sus peores casos. Pero. debemos tener en cuenta que los polígonos que surgen cuando se elimina el 98 . número de vértices del polígono P. la triangulación coincide con P y la 3-coloración es obvia. Demostración. Ejemplos de ellos son: Triangulación por búsqueda de diagonales.Geometría Computacional Demostración. Para concluir este apartado sobre triangulación indiquemos que la generalización a dimensión tres es falsa: existen poliedros que no se pueden descomponer en tetraedros sin añadir vértices adicionales. Triangulación por el método de la otectomía (escisión de orejas). en el triángulo ABC habrá vértices de P. en las complejidades de sus descripciones y en las estructuras de datos que utilizan. etc. Por inducción podemos colorear las triangulaciones de P’ y P’’ asignando en ambas el color 1 al vértice u y el color 2 a v. Si el segmento BC está contenido en el polígono P será la diagonal buscada. el situado más a la izquierda). Si n>3 se toma una diagonal uv que parte T(P) en dos polígonos triangulados T(P’) y T(P’’) cuyo nº de vértices es menor que n. El lector puede construir un polígono en el que AZ no es una diagonal válida). Si no es así. Llamemos A a dicho vértice y B y C a sus adyacentes. Tomamos el más alejado X de la recta BC. Así tenemos una 3-coloración de T(P). Propiedad 2 Cualquier triangulación de un polígono es un grafo plano 3-coloreable.

pi+1) no interseca el interior del triángulo (pj-1. i=1.. pi+1) es una diagonal. y además pueden ser triangulados en un tiempo lineal. Un vértice pi de un polígono simple P es una oreja si el segmento (pi-1. Los polígonos estrellados vienen dados por la propiedad de que al menos contienen un punto q tal que qpi está entero en P para todo vértice pi de P. pi. Figura 4: Polígono estrellado. Esto nos permite utilizar uno de los algoritmos más simples desde un punto de vista conceptual. como es el clásico "Algoritmo de la Poda de Orejas". pj+1).Geometría Computacional conjunto de vértices independientes en un nivel de la jerarquía tienen una propiedad especial: son polígonos estrellados. Triangulación de un polígono Primera aproximación al problema: 99 .N.. Este tipo de polígonos son menos generales que los polígonos simples. pj. Diremos que dos orejas pi y pj no se superponen si el interior del triángulo (pi-1.

n-1 ) FIN_SI FIN_PARA FIN_SI FIN La triangulación se produce uniendo vértices del polígono.i2. sin 100 . hállese T (P) recursivamente mediante: a) Sean pi y pk tal que (pi. 1.P.P ) ) ENTONCES Pintar( P[i]. pk) es una diagonal interior de P pérdida de generalidad.n ) Triangular ( P. Defínase T (P) = P si P es un triángulo. que i < k).Geometría Computacional Función Triangular (int Puntos_del_Poligono. int n) INICIO SI (n>3) ENTONCES PARA ( i ← 0 HASTA n CON INCR+1 REPETIR) i1 ← (i+1) mod n i2 ← (i+2) mod n SI ( Diagonal( i. En caso contrario. 2. algoritmo obtiene una triangulación del mismo.n. b) Sean (suponemos.P[i2] ) EliminaVertice ( i1.

cada polígono simple tiene. Teorema de las dos orejas Excepto los triángulos. . pi+1. la triangulación de un polígono se representa mediante índices. Este teorema crea las bases de las triangulaciones basadas en el algoritmo de poda de orejas. pj . . El algoritmo de recortado de orejas es el siguiente: 1. en el polígono P. pk) es uno de los triángulos. dos orejas que no se superponen. la representación consiste en la lista de índices (i. En la práctica computacional. Añadir arista (Pi-1. Eliminar Pi del polígono P.Geometría Computacional A = (pi. Mientras que el polígono P tenga más de 3 lados: 1. pk) y B = P \ A c) Hállese T (P) = T (A) U T (B) 3. cuyo algoritmo es el siguiente: 101 . j.1. la corta y recursivamente triangula el resto del polígono. . . 1.3. Existen diversos métodos para encontrar un vértice oreja en el polígono. al menos. En este caso se ha utilizado la búsqueda de oreja en O(kn). Esto es: Si (pi. T (P) es la triangulación buscada.Pi+1) a la triangulación. lo que supone la poda de la oreja.2. El algoritmo encuentra una oreja en el polígono. Buscar vértice oreja Pi. k). 1.

III. Si Pi no es una oreja i: =i+1 Complejidad El Algoritmo de recortado de orejas precisa de un preprocesamiento en el que se distinguirán los vértices cóncavos de los que no lo son. Pi+1) Pies una oreja 2. Si Pi es convexo Desde j=0 hasta k se recorren todos los vértices cóncavos Si no hay ningún Pj interior al triángulo (Pi-1.2. Mientras que el vértice Pi no sea una oreja 2. donde k es el número de vértices cóncavos hallados en dicho preproceso y n es el número total de vértices del polígono.Geometría Computacional 1.1. i:=0 2.5 Área de Polígonos/ Intersección de segmentos IMPLEMENTACIÓN 102 . Pi. y su complejidad es de O(kn).

area = (b[0] – a[0]) * (c[1] – a[1]). /* Tipo bool*/ 2 /* Dimensión de un punto*/ /*Cantidad máxima de vértices para un Polígono*/ # define DIM # define PMAX 50 typedef int tpointi [DIM]. area = (b[1] – a[1]) * (c[0] – a[0]). /*Tipo Polígono*/ long area2 (tpointi a. } Área (T) = ½ A x B 2 Área (T) = A x B 103 . return(area). TRUE } bool.Geometría Computacional # define x 0 # define y 1 typedef /* Coord en x*/ /* Coord en y*/ enum { FALSE. /* Tipo punto*/ /*Representación de un punto*/ typedef tpointi tpolygoni [PMAX]. tpointi c) { long area. tpointi b.

Geometría Computacional Área De un Triangulo 104 .

return (area).Geometría Computacional /*IMPLEMENTACION DEL ÁREA DE UN TRIANGULO*/ long area2 (int a[ ]. area= (c[0] – a[0]) *(b[0] – a[1]). int c[ ]) { long area. area= (b[0] –a[0]) * (c[1] – a[1]). } /* Esta función corresponde al cálculo del área de un triángulo */ Para el código de las aristas 105 . int b[ ].

Geometría Computacional Fil os ofí a de los casos especiales 106 .

si un punto ‘c’ está a la izq. int c[ ]) { 107 . b). int b[ ].Geometría Computacional Predicado de izquierda: Una recta es determinada por dos puntos dados en un orden particular (a. b. de la línea determinada por (a. bool Reft (int a[ ]. El punto ‘c’ está a la izq. c) forma un circuito cerrado en sentido anti – horario. b) la tripleta (a. de (a. b) si y solo si el triángulo tiene área +.

108 . b. int c[ ]) { return(area2 (a. } bool collinear (int a[ ]. Definición: Dos o más puntos son colineales si existe una sola recta que los contenga. int b[ ]. int b[ ]. b. por lo que la definición de puntos colineales se puede generalizar de la siguiente manera. el ángulo ABC mide 180º. cuando los tres puntos son colineales. si el punto B está entre los puntos A y C. b.Geometría Computacional return(area2 (a. pero este criterio no es posible de aplicar para más de tres puntos. c) > = 0). c) > 0). } Colinealidad: Note que al igual que en la actividad interactiva. Ya se ha visto como determinar si tres puntos son colineales y que se puede utilizar el ángulo entre los tres puntos para determinarlo. int c[ ]) { return(area2 (a. } bool leftOn (int a[ ]. c) = = 0).

que están a la Derecha de a. y c.Geometría Computacional Definición: Dos o más puntos son no colineales si no existe una sola recta que los contenga. de la misma forma a y b son divididos por las línea l2 conteniendo a c. d. Casos de Intersección Intersección propia: Si dos segmentos a. b y d están a la Izq. d se intersecan en un punto interior c y d son divididos por las líneas l1 conteniendo a. b y c. 109 . Evaluó si esta a la izquierda o a la derecha. b. Se tienen que analizar los cuatro puntos para decir que los segmentos están intersectados.

d . int d[ ]) { if (collinear (a. c) ¦¦ collinear (a. int b[ ]. a). d. 110 .b)) return (FALSE). b. d) && XOR left (c. return (XOR(left (a. c). b. left(a.Geometría Computacional bool Intersect prop(int a[ ]. d) ¦¦ collinear (c. b. b))) } Intersección impropia: Una intersección impropia ocurre precisamente cuando el punto final de un segmento descansa en alguna parte del otro segmento. left (c. d. d. b. a) ¦¦ collinear (c. int c[ ].

b. int c[ ]) { if ( !collinear (a. } 111 . int b[ ]. c)) return (FALSE). if ((a [x] < = c[x]) && (c[x] > = b[x]))) return (( a[x] < = c[x]) && (c[x] > = b[x]))) ((a[x] > = c[x]) && ( c[x] < = b[x]))) else return ((a[y] < = c[y]) && (c[y] > = b[y]))) ¦¦ ((a[y] > = c[y]) && ( c[y] < = b[y]))).Geometría Computacional bool Between (int a[ ].

} ANALISIS DE INTERIORIDAD DE LA DIAGONAL 1.Geometría Computacional bool Intersect (int a[ ]. 112 .Basta analizar la interioridad en la vecindad de sus puntos finales. b)) return (TRUE). c) ¦¦ between (a. int c[ ]. int d[ ]) { if ( Intersect prop (a.Solamente las aristas que inciden en los extremos de la diagonal deben ser analizados. else if between (a. b. else return (FALSE). int b[ ]. 3. b. c. 2. b. d) ¦¦ between (c.La diagonal es interna a través de toda la longitud. 4. d)) return (TRUE). d. a) ¦¦ between (c. d.Analizar solamente unos de sus extremos donde la diagonal incide.

Ángulos externos e internos de un Polígono La suma de las medidas de los ángulos internos de un triángulo es igual a 180º. 113 .Geometría Computacional Definición Si se prolongan los lados de un polígono y toda la figura queda siempre al mismo lado se dice que el polígono es convexo. en caso que parte de la figura quede hacia un lado y parte al otro lado. será cóncavo.

Geometría Computacional Note que en un polígono de "n" lados hay "n" ángulos llanos (prolongando cada uno de sus lados). 114 . por lo tanto. que cada ángulo llano es la suma de un ángulo interno y un ángulo externo. ANGULO CONVEXO Si d es una diagonal deber ser completamente interna al Polígono. observe además. la suma de los ángulos externos está dada por la suma de los ángulos llanos menos la suma de los ángulos internos. (Basta que tomamos una distancia corta de lo que son sus extremos) de los dos extremos dónde la diagonal incide tomaremos solo uno.

ANGULO CONVEXO Mientras no este interna al cono la diagonal será interna. Si es interior la diagonal será externa. i.esta a la izquierda de la diagonal y v+ esta a la derecha de j.Geometría Computacional Determinar si la diagonal es interna al cono. si v. 115 .

Geometría Computacional 116 .

forma y posición de un objeto en la pantalla. 117 .n) Si n>3 Entonces Para i=0 hasta n1 Repetir Si sis i+2 Entonces sis i+1s i+2 es un triángulo eliminar si+1 Triangular (S. podría desearse probar la apariencia de un objeto en la pantalla. Con estas se puede crear una gran variedad de gráficas estáticas. En las aplicaciones interactivas.n1) Fin_si Fin_para Fin III. 6 Algoritmo de Triangulación Algoritmo elemental O(n3) Triangular (S. pero muchas aplicaciones requieren modificar tamaño.7 Transformaciones Geométricas En la unidad II fueron presentadas algunas funciones para dibujar primitivos gráficos y controlar sus atributos. reacomodando su posición o tamaño antes de fijarlo.Geometría Computacional III.

se aplican las transformaciones a la definición de la figura antes de desplegarla. Una traslación se define con un par de coordenadas (Tx. hay que dar un movimiento continuo a los objetos animados en la pantalla. se presentarán varias transformaciones. y no a la imagen desplegada de la figura.Ty) que se llaman distancias de traslación o bien vector de traslación. líneas y polígonos. La solución para realizar estas diversas manipulaciones de figuras es usar transformaciones geométricas. algunas que son generalizaciones de las básicas y otras que son de su propia clase. Por ejemplo. TRASLACIÓN Traslación es una transformación que desplaza un objeto por una distancia y dirección determinadas. tal como "T". de la transformación de P por T resulta un punto P'. que permiten formalizar el proceso de manipular estas figuras para alcanzar el efecto deseado. tales como líneas.Geometría Computacional En programas de animación. generando así uno nuevo. este proceso se escribe: P * T = P' Las transformaciones sirven para manipular figuras que se definen con un conjunto de puntos o vértices. En programas de dibujo/diseño asistido por computadora. si P es un punto. donde Tx representa un 118 . y otras figuras basadas también en puntos. a coordenadas de la pantalla. Una transformación es una entidad matemática. se requiere formar un proceso para traducir los modelos. en unidades del mundo real. Las tres transformaciones básicas son: *Traslación: trasladar por una distancia *Escalación: escalar independientemente en la horizontal y la vertical *Rotación: girar por un ángulo relativo al origen Además de estas. que se usa para transformar un punto. polígonos. a partir de su posición original. escrita con un sólo símbolo. En la notación matemática. Para manipular una figura.

119 .20) P2 = (100.40) P3 * T = (100+40. pero guarda su tamaño y orientación.y) produce un nuevo punto P' (x'. esta operación se escribe P * T = P' Ejemplo III.20) P3 = (100.120) Note que el triángulo cambia de posición. 20+20) = (40.100) Note que para trasladar cualquier polígono. 20+20) = (140. entonces la traslación por T de un punto P (x.1: Traslación Trasladar por T(40.Ty) es una transformación de traslación.20) el triángulo que tiene vértices P1 = (20.y') donde: x' = x + Tx y' = y + Ty (III. es suficiente trasladar sus puntos terminales. 100+20) = (140.1) En la notación de transformaciones. Si T = (Tx.60) P2 * T = (100+40.Geometría Computacional desplazamiento en la dirección x y Ty representa un desplazamiento en la dirección y. P1 * T = (20+40.

Cuando Ex = Ey se produce una escalación uniforme. De la escalación de un punto P(x.y'): x' = Ex * x y' = Ey * y (III.y) por E resulta un punto P'(x'. respectivamente.0. se escala cada vértice independientemente por los factores de escalación.0. La escalación no uniforme es común. tal como en algunas aplicaciones de diseño que construyen las figuras en base de unos pocos patrones que se escalan al gusto para crear la figura deseada.20) P2 (100. de otro modo. Una escalación E = (Ex.Geometría Computacional ESCALACIÓN Escalación es una transformación que cambia el tamaño de un objeto independientemente en las direcciones vertical y horizontal. y un valor > 1 agranda el objeto. Ejemplo III.Ey) se define en términos de factores de escalación Ex y Ey para las direcciones horizontal y vertical.5) el triángulo que tiene vértices P1 (20. se distorsionan las proporciones del objeto. Para escalar un polígono.2) Los factores de escalación pueden tener cualquier valor positivo. un factor = 1 conserva el tamaño.2: Escalación Escalar por E(2.20) 120 . Un factor de escalación < 1 disminuye el objeto.

10) P3 * E = (100*2.Geometría Computacional P3 (100.5) = (40. La escalación con respecto al origen se usa como caso básico porque las ecuaciones son más sencillas.100*0. Es decir.5) = (200.y'). El origen es el único punto que no se desplaza. Usando las rela- 121 . En la transformación de rotación se especifica el ángulo Θ a girar.20*0.5) = (200. Para derivar las ecuaciones de la rotación. y cualquier agrandamiento de un punto lo aleja del origen.0. El punto resultante es P'(x'.2 muestra el triángulo original (línea punteada) y final (línea continua).10) P2 * E = (100*2.0. Esto se debe a que la escalación modifica el espacio coordenado entero. donde la dirección positiva lleva sentido antihorario.3. Rotación es una transformación que desplaza un objeto en una trayectoria circular centrada alrededor del origen. Esta escalación con respecto al origen es un caso especial de la escalación general. con respecto al origen. En esta figura φ es el ángulo original del punto P(x. usaremos la figura III.50) La figura III.100) Aplicando la transformación a cada uno de los vértices: P1 * E = (20*2. Note que la escalación causa un desplazamiento neto al triángulo como efecto lateral.y) desde la horizontal y Θ es el ángulo de rotación que se quiere aplicar a P. tema que se aborda posteriormente. cualquier disminución de un punto lo acerca al origen.20*0. con respecto a un punto arbitrario llamado "punto fijo".0.

3) x' = r cos (Θ + φ) y' = r sin (Θ + φ) (III.5) 122 . El punto central con respecto al cual se gira. El caso de un punto pivote arbitrario se trata más adelante.y) y (x'.4) Aplicando las leyes del seno y coseno de la suma de dos ángulos a (III. Ejemplo III.y') en términos de r y los ángulos φ y Θ: x = r cos (φ) y = r sin (φ) (III.4) tenemos: x' = r [cos(Θ) cos(φ) . El uso del origen como punto pivote es un caso especial que se usa porque las ecuaciones resultan más sencillas. se reemplaza r cos(φ) por x.sen(Θ) sen(φ)] y' = r [sen(Θ) cos(φ) + cos(Θ) sen(φ)] Sustituyendo las ecuaciones (III.Geometría Computacional ciones de los lados de los triángulos.25) (III. y r sen(φ) por y: x' = (r cos(φ)) cos(Θ) .4). podemos conseguir expresiones para (x. se llama punto pivote.y sen (Θ) y' = (r cos(φ)) sen(Θ) + (r sen(φ)) cos(Θ) = x sen (Θ) + y cos (Θ) Estas ecuaciones son la forma final para la transformación de rotación.3: Rotación Girar por 30° el triángulo que tiene vértices: P1 = (50. es suficiente girar cada vértice independientemente por Θ.3) en (III.(r sen(φ)) sen(Θ) = x cos(Θ) . Para girar un polígono por un ángulo Θ.

87) = (117.1 Particionamiento en Piezas Monótonas Polígonos Monótonos: Un polígono ‘p’ se dice monótono respecto a una línea ‘l’ si su frontera puede descomponerse en dos cadenas poligonales monótonas respecto a el.5. 50 * 0.47) P2 * R(30°) = (150 * 0.87 sen (30°) = 0.5.5 se pueden solucionar las ecuaciones: P1 * R(30°) = (50 * 0.25 * 0.Geometría Computacional P2 = (150.5.87) = (92. 150 * 0.87 .25 * 0. Definición de cúspide interior: Es una vértice cóncavo ‘b’ cuyos vértices adyacentes –b y +b están ya sean ambos arriba de ‘b’ o ambos debajo de ’b’.5 + 75 * 0.5 + 25 * 0. 123 .87) = (31.5 + 25 * 0.87 .97) P3 * R(30°) = (150 * 0.25) P3 = (150.87 .75 * 0. Axioma: Si un polígono no tiene cúspide interior entonces es monótono.75) Dado que el seno y coseno para este ángulo son: cos (30°) = 0. 150 * 0.140) UNIDAD IV: PARTICIONAMIENTO DE POLIGONOS IV.

Triangular cada una de estas particiones monótonas Un polígono P es ymonótono si toda línea horizontal intersecta con P como máximo en dos puntos. Localizar los vértices cúspides Un vértice vi es una cúspide si es cóncavo y además vi1 y vi+1 tienen ambos o mayor o menor ordenada 124 . es decir. está formado por dos cadenas ymonótonas Encontrar particiones monótonas 1.Convertir un polígono en particiones monótonas 2. Realizaruna partición en trapecios 2.Geometría Computacional Triangulación de polígonos monótonos Método óptimo para triangulación de polígonos: 1.

uno superior y otro inferior.O(n logn) Cada vértice ---.Encontrar trapecios: Ordenar vértices ---.Localizar las cúspides Cada vértice ---.Geometría Computacional 3.O(logn) 2.O(1) 3.O(1) O(nlogn) O(n) Triangulación de particiones Monótonas Un polígono monótono tiene la ventaja de enfrentar los vértices izquierdos con los derechos para 125 . Eliminar las cúspides uniendo el vértice inferior con el superior en el caso de estar en posiciones opuestas Tiempos de la división monótona 1.Eliminar cúspides Cada cúspide --. Cada trapecio tiene dos vértices.

Geometría Computacional formar diagonales Método de Línea de barrido Estructuras de datos: ● El polígono P de tamaño n ● Línea l con los vértices ordenados de izquierda a derecha ● La lista de diagonales resultantes IV. En una trapezoidalización horizontal Trapezoide tiene dos vértices de apoyo. 1) en su arista superior. 2) en su arista inferior.2 Particionamiento en Trapezoides Trapezoide: Es un cuadrilátero con dos de sus aristas paralelas. 126 .

127 . por un alinea horizontal a través de cada vértice del polígono de forma precisa es un segmento que pasa a través de cada vértice del polígono tal que el elemento es un subconjunto de l polígono’. Dividir un polígono en trapecios(Línea de barrido) Una línea horizontal L cruza el plano verticalmente manteniendo una lista ordenada de izquierda a derecha con los ejes cruzados en todo momento por L Algoritmo Particionamiento en Trapezoide Inicio Ordenar los vértices por ala coordenada ‘y’. Realizar el barrido del plano para construir los trapezoides.Conectar cada cúspide ascendente al vértice de apoyo de arriba. Particionar el polígono en piezas monótonas mediante la conexión de cúspides interiores: .Geometría Computacional Trapezoidalizacion: Una trapezoidalización horizontal del polígono es sostenida por el arrastre.

Geometría Computacional . Una partición en triángulos puede verse como un caso especial de partición de polígonos convexos. Puesto que hay un algoritmo de triangulación optimizado en el tiempo. es decir. para un polígono de ‘R’ vértices cóncavos. .3 Particionamiento Convexo Una partición convexa es aquella en la que las piezas obtenidas son todas convexas.Conectar cada cúspide descendente al vértice de apoyo debajo de su trapezoide. que sus ángulos internos son todos menores o igual a 180º. [r/2] + ┴ ≤ Ø ≤ r+1 r=6 [6/2] +1≤ Ø ≤6+1 4≤Ø≤7 Ø: # de piezas ótimas. Algoritmo de Hertel y Melhorln Inicio 128 .Triangular cada polígono monótono obtenido. Fin IV. lo habrá en la partición en polígonos convexos. Teorema: Sea Ø (fi) el número mas pequeño de piezas convexas en le cual el polígono puede ser particionado. r: cantidad de vértices côncavos.

Remover una diagonal esencial. Diagonal esencial llamamos una diagonal ‘d’ esencial para un vértice ‘v’ si la remover ‘d’ crea una pieza que no es convexa ende. Ejemplo: 129 . Fin.Geometría Computacional Comenzar con una triangulación arbitraria de P. Repetir el paso 2. Si ‘d’ es esencial esta debe incidir en ‘v’ y ‘v’ debe ser cóncava.

Geometría Computacional v 0 1 d 0-21 1-21 1-20 1-15 1-3 td e e i e i Rez no no E no E 9 6 4 4-8 4-6 6-4 6-8 8 9-3 9-13 10 10-13 10-12 12 12-10 8-4 e i i e e e e e i e no E E no no 21 no no no E no 16 16 13 13-13 13-15 15-1 15-20 15-19 16-19 16-18 21-1 21-0 i e e e e i e i no no no E e E no no no no 3 3-15 3-13 3-9 3-8 i e e i E no no E UNIDAD V: CIERRE CONVEXO 130 .

La convexidad se estudia bajo dos puntos de vista. los puntos de la forma corresponden justamente con los puntos del segmento que une x e y. también llamado envolvente convexa. Como generalización del concepto de segmento entre dos puntos. La definición de conjunto convexo es algo sencillo de entender desde un punto de vista geométrico y se puede definir como: Un conjunto S se dice convexo si dado cualquier par de puntos x. se define lo que se entiende como combinación lineal convexa de una serie de puntos: Un punto es una combinación lineal convexa de n puntos cuando puede expresarse en la forma: Cierre Convexo El cierre convexo. y por extensión en los problemas relacionados con matemáticas que son prácticamente todos. ya 131 . es uno de los principales problemas a la hora de trabajar en problemas de Geometría Computacional.Geometría Computacional V. para más tarde analizar lo que se entiende por convexidad y concavidad para funciones. por un lado el concepto de convexidad aplicado a conjuntos.1 Definición de Convexidad y Cierre Convexo Convexidad La convexidad es uno de los conceptos más utilizados en la programación matemática. Este concepto queda expresado en un lenguaje matemático de la siguiente forma: Para comprender mejor la definición de conjunto convexo debe tenerse en cuenta que dados dos puntos x e y. y pertenecientes al conjunto se cumple que el segmento xy que forman está contenido en dicho conjunto S.

132 . se dice que CC(S) es la envolvente o cierre convexo de S si: . La envolvente convexa de una nube de puntos es siempre un polígono convexo. en el procesado de imágenes o en localización. El uso de la envolvente convexa en diversos tipos de aplicaciones es muy común. Una definición más formal es la que se expone a continuación: Dado un conjunto de puntos finito S.CC(S) es convexo. . . El problema del cierre convexo no está tan solo centrado sobre aplicaciones prácticas sino también sobre múltiples cuestiones aparentemente sin relación que surgen en la Geometría Computacional. como por ejemplo. Una idea intuitiva de que es el cierre convexo es la figura que se formaría si soltásemos una banda elástica que rodeara a una nube de puntos después de soltarla.Geometría Computacional que es necesario utilizarlo y aplicarlo para muchos de los problemas que se tratan en esta área. . . Los puntos de la frontera de la envolvente convexa se llaman vértices o extremos del cierre convexo. . . .S está contenido en CC(S). . .CC(C) es el menor convexo que contiene a S. .

Puntos de Frontera: Los puntos de la frontera de la envolvente convexa se llaman vértices o extremos de la envolvente convexa. Punto más alto. tres o más dimensiones. Punto más bajo. Puntos por definición: 1. 3. con el mismo nombre de envolvente convexa. pero también se les suele denominar. ya sea para dos. Puntos Extremos: Los puntos extremos de un conjunto “S” de puntos en el plano son vértices del cierre convexo en los cuales los triángulos interiores son estrictamente convexos menores que PI. de forma poco afortunada. Nosotros analizaremos sólo algunos algoritmos para averiguar el convex hull de puntos situados sobre dos dimensiones. 133 . Se puede calcular la envolvente convexa de una nube de puntos a partir de su diagrama de VORONOI en tiempo lineal. Es posible calcular la envolvente convexa de un convexo S en tiempo 0(n log n) y ese tiempo es óptimo.Geometría Computacional Algoritmos Hay muchos métodos para el cálculo del cierre convexo. Punto más a la izquierda. seria en tiempo óptimo. 2. Punto más a la derecha. pero no es una vía practica si no tenemos calculado de antemano el diagrama de Voronoi. 4.

2 Algoritmo para puntos no extremos Función: bool EsPuntoNoExtremo (int* puntos) Inicio Para cada i hacer Para cada j!=i hacer Para cada k!=i!=j hacer Para cada l!=i!=j!=k hacer 134 . No-Extremos V.Geometría Computacional Puntos extremos Puntos No Extremos: Un punto no extremo si y solo si. este es interior al triangulo cuyos vértices son puntos del conjunto dado y no es una esquina de un triángulo.

que será el que menor coordenada y posea (así nos aseguramos que pertenezca al cierre convexo). Pj) es no. La complejidad de este algoritmo será de nh. p[j]) && P[l] está a la izquierda || sobre (p[k]. que cumplirá que todos los puntos están situados a la izquierda del segmento AB. Paso 3: Análogamente podemos encontrar un punto C que cumpla que todos los puntos estén a la izquierda de BC. p[j])) entonces Retornar verdadero Fin. donde h es el número de caras del cierre convexo.Geometría Computacional Si (P[l] está a la izquierda || sobre (p[i]. Paso 2: Se puede encontrar un punto B. 135 . Repetimos este proceso para el resto de puntos y obtendremos la envolvente convexa. P[j]) entonces (Pi.3 Gift Wrapping Paso 1: Elegimos el punto A. Este punto será nuestro punto inicial. V. Algoritmo para aristas no extremas Función: bool EsAristaNoExtrema (int* p) Inicio Para cada i hacer Para cada j!=i hacer Para cada k!=i!=j hacer Si (P[k] no está a la izquierda || sobre (P[i].extrema Fin.

lo más pronto posible. V. todos los puntos que hayan quedado dentro de este cuadrilátero no formaran ya parte de la frontera.4 Quick Hull La idea del Quick Hull es ir descartando.p[i+1] i++ Mientras p[i]!= p[0] Retornar p Fin. que son los más interiores de la nube de puntos… Paso1: Encontrar os cuatro puntos extremos de la nube de puntos (norte. 136 . este y oeste) y formar un cuadrilátero con estos puntos como esquinas. Función: Jarvis(P) Inicio i=0 P[0]=punto más a la izquierda de P Hacer p[i+1]=el punto tal que los otros puntos en P están a la derecha de la recta p[1]. los puntos que no formarán parte de la frontera del cierre convexo. En cada una de estas regiones obtendremos el punto mas alejado al lado del cuadrilátero adyacente a esa zona. sur. Paso2: Los puntos exteriores al cuadrilátero se encontrarán divididos en cuatro (o menos) zonas no comunicadas.Geometría Computacional Algoritmo de Gift Wrapping.

 Características  Es recursivo  Cada recursión separa los datos en varios grupos  Es la manera más rápida de calcular el cierre convexo Algoritmo Quick-Hull. Dado un conjunto de puntos y un segmento AB que sabemos que está en el cierre convexo.) 2. Los puntos dentro del triángulo ABC no pueden estar en el cierre. Esta figura resultante será el cierre convexo. A pesar de ser de orden cuadrático. (Una buena cuerda para empezar es unir el vértice más a la izquierda con el vértice más a la derecha. Entre los puntos dados. El algoritmo Quick Hull calcula la envolvente convexa en tiempo 0(n2).. Llámese este C. encontrar el más distante de AB. 137 . 1. Algoritmo Quick-Hull. Ponerlos en el conjunto s0. 3.Geometría Computacional Paso3: Seguiremos actuando para cada nueva región según las reglas anteriores hasta que no queden vértices externos a la figura. suele tardar menos tiempo que calculando mediante diagrama de Voronoi.

 Una vez hecha la partición. UNIDAD VI: DIAGRAMA DE VORONOI VI. Poner los puntos que yacen fuera de AC en el conjunto S1 y los puntos que yacen fuera de BC en s2. recursivamente se invoca la función sobre los conjuntos s1 y s2. P2…Pn} Un conjunto de puntos en el plano Euclidiano bidimensional estos son llamados los sitios. Sea P= {P1.Geometría Computacional 4.1 Definiciones Básicas y Propiedades El diagrama de Voronoi es un conjunto de puntos es una partición del plano en regiones cada una de las cuales consiste de los puntos mas cercano a un sitio en particular que cualquier otro. j≠i} 138 . si cada punto en el plano es asociado a su sitio mas cercanos el plano quedara particionado todos aquellos puntos asignados a Pi forman la región de Voronoi v (Pi) Consta de todos aquellos puntos que están más cercanos a Pi que a cualquier otro punto del conjunto. NOTACION MATEMATICA V (Pi)= {x:| Pi-x |≤Pj-x|.

Geometría Computacional CONSTRUCCIÓN DEL DIAGRAMA Para una cantidad pequeña de sitios: n=2 TODOS TIENEN GRADO 3 n=3 sitios 139 .

Geometría Computacional n=4 sitios 140 .

Si hay algún círculo a través de Pi y Pj (Pi. Pj) es una arista de Delaunay lo contrario también se mantiene Para cada arista de Delaunay hay algún círculo vacío. Pj) es una arista de Delaunay. Si Pj es el vecino mas cercano a Pi entonces Pi y Pj (Pi. c (v) es el cirscunscirculo del triangulo Delaunay correspondiente a v.… entonces ‘v’ es el centro del circulo. P2. Si v es un vértice de Voronoi en la unión deP1. 2. El interior de c (v) no contiene sitios. 5. 3. 7. 6. 4. v (Pi) es ilimitada si y solo si su sitio es correspondiente pertenece al cierre convexo del conjunto de puntos dados.Geometría Computacional Propiedades 1. P3. 141 . Pj) el cual no contiene otros sitios Entonces (Pi. Cada región de Voronoi v(Pi) es convexa.

Geometría Computacional Propiedades # 1 Todo punto perteneciente a una arista de Voronoi del conjunto de puntos S es equidistante a los puntos más cercanos de S Propiedades # 2 Los vértices de Voronoi son los centros de círculos circunscritos por tres puntos de S. Propiedades # 3 142 . Dado un vértice v. llamamos a ese círculo C(v).

Si el diagrama de Voronoi es degenerado. Basta con unir todos aquellos generadores que compartan un eje de Voronoi.2 Triangulación de Delaunay. el círculo C(v) no contiene a ningún otro punto de S Propiedades # 4 El polígono V(p) no tiene frontera si y sólo si p es un punto del RC de S V. el paso anterior no devuelve una triangulación. Es una traslación del plano dual al diagrama de Voronoi.Geometría Computacional Para cualquier vértice v del diagrama de Voronoi. Se puede construir la triangulación de Delaunay a partir del diagrama de Voronoi. sino una pretriangulación de 143 .

5. 6. El interior de cada cara de Delaunay no contiene ciclos. VI.3 Algoritmos Y Aplicaciones ¿Cómo calcular el diagrama de Voronoi de S? 144 . Propiedades 1. La frontera de Delaunay es el cierre convexo de los sitios. Una triangulación. aunque es un polígono inmediato de triangular. 2. A cada arista de Delaunay la corresponde una arista de Voronoi. 4. 7.Geometría Computacional Delaunay. A cada cara de Delaunay la responde un vértice de Voronoi. es una triangulación de Delaunay si no hay cuatro puntos de P Que sean cocirculares: * Cada cara es un ∆ y las caras son llamadas As de Delaunay. A cada nodo de Delaunay la corresponde una región de Voronoi. Una arista de Delaunay es la recta dual de una arista de Voronoi. 3.

Dividir S en dos subconjuntos S1 y S2 de aproximadamente el mismo tamaño. 2. 3.Geometría Computacional Paradigma de divide y vencerás 1. Unir la información obtenida en 2 para obtener Vor(S). 145 . Calcular recursivamente Vor(S1) y Vor(S2).

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. para mezclar el cierre de L y el de R es necesario unirlos utilizando las tangentes comunes más altas y bajas.  Dividimos los puntos en dos bloques. encontramos el convex hull de L y R. 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 de R  Recursivamente.Geometría Computacional  Ordenamos los puntos según la coordenada x. La tangente superior común puede 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. Debido a que la mezcla no puede realizarse en tiempo lineal el cierre convexo puede ser encontrado en tiempo 0(n log n) 146 .

147 .Geometría Computacional UNIDAD VII: BUSQUEDA E INTERSECCION VII. para que una arista sea contada como un cruce de R uno de sus puntos finales debe estar estrictamente arriba de R y el otro punto final abajo o sobre R. El punto “q” esta dentro o fuera del polígono. si el numero de cruces es impar o par respectivamente.1 Punto que esta en el interior de un polígono CASO DE UN POLIGONO CONVEXO CASO DE UN POLIGONO CONCAVO Definición: Cruces de rectas Trazar una recta R desde el punto de consulta “q” en la misma dirección positiva del eje de las ”x” y contar el mismo de intersección de R con la frontera del polígono.

(10. cruse=0. double x. (8.Geometría Computacional Numero de cruces: (5. (15.7). d++) { 148 . i++) for (d = 0. (6. i < n. int n) { int i. d < DIM. for (i = 0. d. Ejemplo: # define x 0 # define y 1 bool inpoly (int [ ]. int P [ ] [ ].6).9).16).11). int i1.

149 . if (x>0) cruce++. } } if ((cruce % 2) == 1) return (TRUE). else return (FALSE). cuando tenemos 4 puntos en una posición convexa.Geometría Computacional P[i][d] = P[i][d]-q[d]. Este proceso se puede ver de manera sencilla. estos cuatro puntos tienen dos posibles triangulaciones (obsérvese la figura). i1 = (i + n-1) % n.P[i1][x]*P[i][x]*P[i][y] (double)(P[i1][y]-P[i] [y]). if(((P[i][y] >0 && (P[i1][0y] <= )) { x= P[i][x]*P[i1][y].2 Intercambio de Segmentos en Polígonos Convexos El intercambio de segmentos o aristas o diagonales o el flipado de las mismas como también se conoce consiste simplemente en intercambiar el segmento que deseemos por el complementario a ese en la triangulación existente. } ((P[i][y] >0 && (P[i1][0y] <=0))) VII.

en polígonos no nos fijaremos en los ángulos). no contienen en su interior al cuarto punto. Las aristas que se flipan se las denomina como ilegales. todas nuestras diagonales del polígono serán ilegales. Y esto nos da idea de la ventaja que nos da este proceso.Geometría Computacional La triangulación en la cual los círculos circunscritos son vacíos. o del polígono convexo si es aquí donde estamos trabajando. 150 . es la triangulación con un vector de ángulos mayor (esta forma de flipar se usa principalmente para calcular la triangulación de Deloné de una nube de puntos. Hay que hacer notar que el flipado de aristas o de diagonales produce un cambio local en todo el conjunto global de puntos. ALGORITMO Algoritmo para intercambiar segmentos: 1. puesto que son potencialmente flipables. es decir. si estamos en una nube. pero como se comento eso es principalmente en nubes de puntos. A esta operación de sustitución de una arista por otra en un cuadrilátero convexo la llamaremos intercambio de aristas o flip (en realidad flip se llama tan solo cuando hay una mejora en el vector de ángulos. Eliminar el segmento que vamos a flipar. por tanto en nuestro caso. ya que podemos ir variando localmente una triangulación sin afectar al resto. y del mismo modo deshacer los pasos dados sin mayor problema. en polígonos lo único que debemos saber es el mecanismo general. que es el intercambio de una arista por la otra).

Obtener los puntos comunes entre los asociados de los extremos del segmento. se iluminan de color verde todos los segmentos que son potencialmente flipables. 3: Una vez que se ha realizado el intercambio se puede comprobar en este momento como queda la triangulación y el cambio que se ha producido. 4. comprobar de entre ellos con cuales es posible trazar un segmento y añadirlo. ya que los segmentos potencialmente flipables se mantienen iluminados. 6. 151 . en nuestro problema son todas las aristas internas del polígono. Terminar. y se puede volver a flipar si se desea. 5.Geometría Computacional 2. entonces añadir un segmento cuyos extremos son dichos puntos. Si tan solo tenemos dos puntos comunes entre los asociados. 2: El siguiente paso es seleccionar la diagonal que queremos flipar. Si hay mas de dos puntos comunes. El algoritmo utilizado para flipar segmentos es el que se puede ver en esta secuencia: 1 2 3 1: Cuando se va a realizar un intercambio de segmentos. así pues como se ve en la viñeta se iluminan las diagonales. para ello tan solo hay que situar el cursor encima de ella (si estamos en el caso de que estemos intercambiando manualmente). pulsaremos y se procederá a realizarse el flipado de dicha arista interna. 3. Obtener los puntos asociados de ambos extremos del segmento. y aparecerá como se muestra en la secuencia una mano.

Geometría Computacional

152

Geometría Computacional

153

Geometría Computacional

154

Geometría Computacional 155 .

Geometría Computacional 156 .

e5 V4 3 2 1 0 4 3 2 1 0 5 Geometría Computacional 157 .

Sign up to vote on this title
UsefulNot useful