Libro de Geometria Computacional

195
UNIVERSIDAD NACIONAL DE INGENIERIA Libro de Geometría Computacional Docente: Ing. Grevin Silva Lizano Viernes 11 de Julio de 2008

Transcript of Libro de Geometria Computacional

Page 1: Libro de Geometria Computacional

UNIVERSIDAD NACIONAL DE INGENIERIA

Libro de Geometría Computacional

Docente:

Ing. Grevin Silva Lizano

Viernes 11 de Julio de 2008

Page 2: Libro de Geometria Computacional

Geometría Computacional

2

Page 3: Libro de Geometria Computacional

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

3

Page 4: Libro de Geometria Computacional

Geometría Computacional

I.10 Otros Algoritmos Importantes ……………………………………………..27

I.10.1 Intersección entre dos segmentos…………………………………....27

I.10.2 Búsqueda del polígono que contiene un punto……………………30

I.10.2.1 Test del Rayo ……………………………………………………….30

I.10.2.2 Clasificación Geométrica…………………………………………..31

UNIDAD II : PRIMITIVOS GRAFICOS

II.1 Introducción a la Gráfica por Computadoras…………………………….36

II.2 Librerías Gráficas…………………………………………………………...41

II.2.1 Funciones de las Librerías Graficas………..……………………….43

II.3 Primitivos Gráficos…………………………………………………………..65

II.3.1 Figuras Geométricas………………………………………………….66

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

UNIDAD III : TRIANGULACION DE POLIGONOS

III.1 Definición de Polígono…………………………………………………….86

III.2 Clasificación de Polígonos………………………………………………..87

III.3 Teoremas de la Galería de Arte …………………………………………92

III.3 Teoría de Triangulación…………………………………………………..98

III.4 Área de Polígonos/ Intersección de Segmentos………………………104

III.5 Algoritmo de Triangulación de Polígonos/Implementación………….120

III.6 Transformaciones Geométricas………………………………………….120

4

Page 5: Libro de Geometria Computacional

Geometría Computacional

UNIDAD IV : PARTICIONAMIENTO DE POLIGONOS

IV.1 Particionamiento en Piezas Monótonas………………………………...126

IV.2 Particionamiento en Trapezoides………………………………………..129

IV.3 Particionamiento Convexo………………………………………………..131

UNIDAD V : CIERRE CONVEXO

V.1 Definiciones de convexidad y cierre convexo…………………………134

V.2 Algoritmo para Puntos No-Extremos …………………………………..137

V.3 Gift Wrapping….…………………………………………………………..138

V.4 Quick Hull............................................................................................139

UNIDAD VI : DIAGRAMA DE VORONOI

VI.1 Definiciones Básicas y Propiedades………………………………….…141

VI.2 Triangulación Delaunay…………………………………………………..146

VI.3 Algoritmos y Aplicaciones en Detalle……………………………………147

UNIDAD VII : BUSQUEDA E INTERSECCION

VII.1 Punto que esta en el interior de un Polígono………………………….150

VII.2 Intercambio de Segmentos en Polígonos Convexos…………………152

5

Page 6: Libro de Geometria Computacional

Geometría Computacional

UNIDAD I : INTRODUCCION A LA GEOMETRIA COMPUTACIONAL

I.1 Qué es la geometría computacional

La Geometría computacional ha sido siempre un área importante en ingeniería, al punto que ya en la década del ’50 existían sistemas rudimentarios de CAD (Computer Aided Design), a pesar de que el hardware de esa época era sumamente limitado. A finales de los ’70 y comienzos de los ’80 aparecen las Work-station, y fue ahí cuando se desarrollaron la mayoría de los algoritmos geométricos que se utilizan hoy en día; sin embargo es con el advenimiento de las PC, los video-juegos, los efectos especiales y recientemente la realidad virtual, que las aplicaciones de computer graphics están alcanzando su máximo potencial.

Una particularidad de los algoritmos geométricos es que por el hecho de requerir de operaciones con números reales, pueden dar un resultado equivocado. Si esto no se tiene en cuenta, los métodos pueden ser poco robustos (en general andan bien, pero en ciertos casos pueden no funcionar). De hecho el arte de la buena programación en esta área gira en torno a este concepto.

Análisis de algoritmos

Cuando los algoritmos han de ser utilizados por una máquina, un criterio fundamental de eficiencia es la rapidez de ejecución. Para medirla sin haber de programar y ejecutar cada algoritmo, se utiliza un modelo teórico de máquina en el que ciertos procesos tienen asignado un coste (= tiempo) unidad. En el RAM real se acepta que un número real se puede almacenar en una unidad de memoria, y las operaciones siguientes se consideran primitivas y pueden realizarse con coste unitario:

1. acceso a la memoria;

2. operaciones aritméticas básicas (+, −, ×, /);

6

Page 7: Libro de Geometria Computacional

Geometría Computacional

3. comparación de dos números reales (<, ≤, =, _=, ≥, >);

4. (ocasionalmente) raíces enésimas, funciones trigonométricas, la exponencial y el logaritmo.

El comportamiento de un algoritmo depende del conjunto específico de datos sobre los cuales se ejecuta cada vez.

El análisis en el caso peor, el único que describiremos aquí, consiste en calcular el coste total (= numero de operaciones primitivas) de ejecutar el algoritmo en la situación mas desfavorable.

La cantidad de datos recibidos por el algoritmo se mide en función de algún parámetro n, y el coste será una función T(n). Como los algoritmos se diseñan para grandes valores de n, no se calcula T(n) “exactamente”, sino en orden de magnitud, ignorando los coeficientes

constantes. Escribimos T(n) O (f(n)) para acotar superiormente el tiempo de ejecución T(n) de un algoritmo. Así, si hemos de calcular la distancia entre dos puntos, tardaremos O (1) (¡o sea tiempo constante!), 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. Por ejemplo, hay una diferencia abismal de disponer, al resolver un problema, de un algoritmo de orden O(n log n), de uno O (n2), o bien de uno O (n4). 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.04 segundos, uno O (n2) tardaría unos 10000 × 10000 μs, es decir 1 minuto y 40 segundos, y uno O (n4) tardaría ¡unos 317 años!

7

Page 8: Libro de Geometria Computacional

Geometría Computacional

Si hay 100000 datos, los dos primeros pasan a = 0.4 segundos y a 2 horas y 47 minutos, respectivamente, dejamos al lector las cuentas para el O (n4), que son ya en milenios.

Muchos avances espectaculares en la rapidez de los ordenadores son en realidad mejoras en los algoritmos (que se traducen en el software), las cuales incrementan drásticamente la rapidez de ejecución, tal como acabamos de ver.

I.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. Así, por ejemplo, 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, matemáticas y técnicas de computación.

La génesis, interpretación, y comprensión global de lo que se hace, corresponden a ramas diversas de la medicina, pero, como vemos, no se puede decir que la resonancia magnética haya sido un avance “de la medicina”, ya que ha sido un avance producido por una acción combinada de muchas disciplinas científicas.

Otra de las características de las tecnologías mas recientes es el uso crucial del ordenador, no ya como destinatario de las aplicaciones desarrolladas, 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, los ordenadores actualmente una herramienta utilizada en el diseño, producción o estudio de objetos y de procesos.

Las matemáticas, de una u otra forma, participan en todos estos avances tecnológicos, a veces de forma significativa, pero poco visible, a veces con un protagonismo crucial. En el caso de la geometría, veremos

8

Page 9: Libro de Geometria Computacional

Geometría Computacional

a continuación diversas áreas de investigación aplicada en las que tiene participación sustancial. Entre estas, mencionaremos la Informática gráfica, el Diseño y fabricación asistidos por ordenador (CAD/CAM), la Caracterización y reconocimiento automático de formas, el Diseño de circuitos integrados gigantes, la Visión artificial, los Sistemas de información geográfica y la Robótica.

I.3 Áreas de aplicación de la Geometría Computacional

Una característica esencial de los objetos es su “forma”, y es natural que la geometría sea herramienta matemática indispensable para describirla, extraerla, modificarla o aproximarla.

Naturalmente la representación de formas es el núcleo de la Informática grafica, 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, la geometría juega un papel determinante (Figura 1).

9

Page 10: Libro de Geometria Computacional

Geometría Computacional

Figura 1: Esquema de proyección en pantalla.

El Modelado geométrico trata la representación de formas de cara a visualizarlas, analizarlas, diseñarlas y estudiar su comportamiento. Todo ello exige adaptarse a los métodos existentes de medición y de toma de muestras, cuando se trata de objetos dados, o adaptarse a los requisitos de los sistemas de manipulación cuando las formas se están creando. En este ultimo caso, los sistemas ayudan tanto a conseguir características estéticas del objeto, como a ajustar y prever su adecuación funcional, de lo cual es ejemplo claro el diseño industrial.

La definición y exploración de una “forma” puede hacerse con un sistema CAD (Computer Aided Design), que permite mover puntos de control y modificar el aspecto. Este es un proceso corriente, como decíamos, en la fabricación de objetos, pero también en la arquitectura (Figura 2).

Otro aspecto es el de la fabricación propiamente dicha de los objetos.

Una posibilidad es que sean obtenidos a partir de masas sólidas (como, por ejemplo, bloques de metal o de piedra) y que se precise programar los movimientos de las herramientas o robots que efectúan los cortes,

10

Page 11: Libro de Geometria Computacional

Geometría Computacional

no sólo de forma que se llegue al resultado deseado, sino también evitando colisiones y optimizando el proceso global.

En el caso en que el proceso de producción utilice el corte con filamento electrificado, la forma externa se compondrá de superficies regladas.

A veces el diseño incluye animaciones y simulaciones de movimiento, las cuales idealmente se tendrían que poder articular con los sistemas de CAD

estándares (Figura 4).

En los procesos de inspección industrial, que en algunos aspectos incluye lo que se llama control de calidad, se verifican los productos respecto a lo que se deseaba obtener, así como en cuanto a las desviaciones del modelo CAD. El objeto se “captura” geométricamente con alguna forma de scan, o con un mecanismo táctil para obtener coordenadas (Figura 5), como el coordinante measuring machine. Un aspecto importante es el de comprobar que se cumplan determinados requisitos, como el que la separación de la forma teórica, digamos cilíndrica, por ejemplo, este dentro del intervalo de los márgenes aceptables, la tolerancia.

11

Page 12: Libro de Geometria Computacional

Geometría Computacional

Figura 5: Reconstrucción digital de una copa [3].

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).

No sólo permite fabricar nuevos objetos idénticos al anterior, sino también muchas otras posibilidades, como estudiarlo o modificarlo para mejorarlo.

El estudio de un cuerpo a partir de las imágenes obtenidas como secciones planas del mismo, técnica llamada tomografía, es un proceso común a la producción industrial y a la diagnosis médica, 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.

12

Page 13: Libro de Geometria Computacional

Geometría Computacional

Figura 6: Interpolación entre secciones planas [4].

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. Por ejemplo, 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. Como es fácil de imaginar, también aplicaciones médicas esta es un área central de investigación y desarrollo.

Figura 7: Dos modelos digitales de terrenos [6,7].

La moderna cartografía digital es otro campo de aplicación fecunda. Los terrenos se modelan digitalmente, con mallas triangulares o

13

Page 14: Libro de Geometria Computacional

Geometría Computacional

cuadrangulares, lo que permite representarlos, hacer simulaciones y generar simplificaciones (Figura 7). Se ha de tener en cuenta que las nuevas técnicas de medición, como el posicionamiento por satélite, o el barrido láser desde el aire, dan la posibilidad de obtener conjuntos enormes de datos, candidatos a producir imágenes y modelos ajustadísimos, pero que generan problemas importantes de gestión geométrica e informática.

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, que permitan representaciones menos voluminosas de los objetos a medida que se necesite menos precisión (Figura 8), por ejemplo al alejarnos de ellos.

Por lo que respecta a la Robótica, quizás convenga decir que cuando pensamos en robots a menudo nos imaginamos maquinas con gran autonomía y movilidad propia, cuando no incluso antropomórficas y sofisticadas, pero hay que recordar los miles de péquennos robots que se utilizan en cadenas de montaje, mucho mas cercanos a la idea de mecanismo articulado.

14

Page 15: Libro de Geometria Computacional

Geometría Computacional

La planificación de los movimientos para cumplir las tareas deseadas en los momentos precisos, evitando problemas y colisiones, es también un cometido de fuerte contenido geométrico. Todas estas disciplinas, además de tener como rasgo común el carácter geométrico de los objetos involucrados, comparten una característica fundamental que el lector debe tener siempre presente al pensar en los problemas de Geometría computacional que se originan, y que abordaremos en la próxima sección: el carácter masivo de la información manipulada.

Así, una imagen sencilla en una pantalla de ordenador, puede constar de miles o decenas de miles de objetos elementales (como triángulos), que serán cientos de miles en una imagen cinematográfica. Y si la reconstrucción de una copa puede hacerse con unos cuantos cientos o miles de puntos, la descripción de una región en un sistema de información geográfica requerirá la manipulación de varios millones.

Finalmente, comentaremos que el desarrollo acelerado de Internet ha hecho que sea imprescindible disponer de estructuras para la representación eficiente en sistemas multimedia, así como la necesidad de posibilitar la transmisión rápida y precisa de modelos geométricos complejos.

Esta es un área actualmente en ebullición, pues se aspira a poder hacer a distancia muchas de las cosas que hemos mencionado, como la diagnosis, el diseño o la visualización

I.4 Ejemplos de Geometría Computacional

La Graficación de Datos Numéricos

15

Page 16: Libro de Geometria Computacional

Geometría Computacional

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, gráficas de producción o de inventario, gráfica cartesiana, o de otro tipo. Viendo una gráfica así se pueden deducir rápidamente los patrones o características de los datos.

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. Además de los geográficos, hay mapas de tránsito, de vegetación, demográficos, meteorológicos, topográficos y otros.

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, eléctricos, y electrónicos. Tales sistemas incluyen edificios, plantas eléctricas y químicas, motores, automóviles, aviones, sistemas ópticos, redes telefónicas y computadoras. Algunos sistemas de CAD se enfocan solamente en la producción de dibujos para un sistema. Otros se enfocan en la realización de pruebas o simulaciones sobre el diseño, por ejemplo: las propiedades eléctricas, térmicas, estructurales o químicas. A veces "post-procesan" el diseño para sacar listas de componentes o materiales.

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. Permite al científico examinar los cambios sobre el tiempo de funciones matemáticas, y los modelos matemáticos de sistemas tales como flujos hidráulicos, reacciones químicas, distorsión de materiales bajo presión, y los órganos humanos. También se pueden simular vuelos para entrenar pilotos, poniendo efectos como distintos tipos de terreno, otras aeronaves, nubes,

16

Page 17: Libro de Geometria Computacional

Geometría Computacional

viento, y las luces del aeropuerto de noche. La animación por computadora es también utilizada para hacer caricaturas, juegos de video, publicidades y videos informativos.

El Control de Procesos

Mientras la simulación permite al usuario interactuar con un mundo sintético, otras aplicaciones le permiten interactuar con el mundo real para monitorear y controlar procesos. Despliegues de estado para plantas químicas y eléctricas, refinerías, aeropuertos y redes de computadoras exhiben valores de datos registrados en partes críticas del sistema. Por ejemplo, en una planta química el despliegue puede mostrar cuán lleno es un tanque y usar color para mostrar su temperatura. Se pueden dibujar medidores para mostrar presión y volumen de flujo, y desplegar con intermitencia un mensaje cuando sucede una condición crítica. El supervisor del proceso puede ajustar válvulas o controles de temperatura que son controlados por la misma computadora. 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, altura y velocidad, ayudando al controlador a manejar el tráfico. La mayor comprensibilidad de la información gráfica minimizaría los choques.

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, exhibiendo texto con distintas fuentes y tamaños de caracteres, integrando al texto dibujos sintéticos como las gráficas de barras o los dibujos arquitectónicos, e imágenes fotográficas grabadas con una cámara de video o un "scanner". Para la automatización de una oficina, se pueden preparar y difundir documentos electrónicos que incluyen elementos gráficos tales como un organigrama o gráfico de barras.

El Arte y la Publicidad

17

Page 18: Libro de Geometria Computacional

Geometría Computacional

Se pueden preparar imágenes para comunicar un mensaje usando las técnicas de dibujo y pintura por computadora. Estos permiten la generación del arte de la publicidad con mayor rapidez y menor costo que los métodos manuales. También se usa la gráfica por computadora para preparar diapositivas para presentaciones científicas y educativas. El arte por computadora, a pesar del rechazo por algunos "puristas", está ganando reconocimiento como un medio legítimo de la expresión artística. En todos estos campos de la gráfica por computadora se nota que se están creando con mayor frecuencia imágenes que, en vez de transferirlas a otros medios tales como papel y película, son exhibidas en la misma pantalla de la computadora.

Uno de los avances más notables de los últimos tiempos de la aplicación de la matemática computacional es en la medicina. No sospechamos en nuestra práctica diaria la cantidad de teoría matemática que está involucrada en los modernos aparatos de diagnóstico, en el diseño de cirugía ocular u otros desarrollos.

I.5 Técnicas de interacción

Con frecuencia, el usuario debe introducir una posición que satisfaga una determinada condición, por ejemplo tener la misma coordenada x que la posición previa. En estas situaciones, la aplicación puede ayudar al usuario a realizar su tarea proporcionándole técnicas específicas que simplifiquen el proceso de interacción. En el ejemplo anterior se puede hacer que el cursor solo se mueva en horizontal.

En general, el diseño de software de entrada debe de tener en cuenta el contexto concreto en el que va a utilizar, tratando de dar la mejor asistencia posible al usuario para la función que este debe realizar. En esta sección se examinan algunas de las técnicas de posicionamiento y selección más usadas.

I.6 Técnicas de posicionamiento

18

Page 19: Libro de Geometria Computacional

Geometría Computacional

El objetivo de las operaciones de posicionamiento es permitir la introducción de un punto. Desde el punto de vista del usuario, que utiliza un dispositivo que controla un cursor, el proceso de entrada es el que se muestra en la figura 3.2.a.

Figura 3.2 Posicionamiento. Desde el punto de vista del usuario (a), y del software de entrada (b).

I.7 Entidades geométricas fundamentalesI.7 Entidades geométricas fundamentales

Siguiendo una política usual en el ambiente computacional, los cuerpos se describen descomponiéndolos en entidades más simples. Por ejemplo, un poliedro 3D puede ser descrito a través del conjunto de polígonos que forman su superficie. A su vez, cada polígono puede descomponerse en un conjunto de segmentos, y

19

Page 20: Libro de Geometria Computacional

Geometría Computacional

finalmente cada segmento se define especificando la posición de sus puntos extremos.

Salvo algunas excepciones, como el caso de curvas splines, o superficies bi-cúbicas, las entidades geométricas que se utilizan son siempre las más simples: rectas, triángulos, tetraedros, etc. 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). De hecho el hardware está especialmente preparado para recibir este tipo de entidades y no otras1.

A continuación se detallan las entidades geométricas fundamentales,

I.7.1El punto

Se lo define como una n-upla de números reales.

Por ejemplo en 2-D [x,y] y en 3-D [x,y,z].

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. Descripción de un punto en 2D

I.7.2 Segmento

Se lo define a través de sus

dos puntos extremos [P1,P2]

1 En la especificación de una placa gráfica por ejemplo, suele encontrarse datos como “tantos millones de triángulos por segundo” pero nunca “tantos miles de círculos”, o “tantos millones de cuadrados”.

20

x

y

x

y

P1

P2

Page 21: Libro de Geometria Computacional

Geometría Computacional

Si un segmento tiene orientación se

lo llama vector.

En ese caso [P1,P2] [P2,P1] Representación de un vector en 2D

I.7.3 Polígonos

Se llama así a una superficie plana cuyo borde está formado por segmentos rectos.

Se dice que el polígono es convexo si todo su borde

es visible desde todo punto de su interior. 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.

El polígono más simple es el triángulo. Cualquier

polígono puede ser descompuesto en un conjunto

de triángulos. Polígono no-convexo en 2D

I.7.4 Poliedros

Poliedro es un volumen cuya superficie está formada por polígonos.

Igualmente se dice que el poliedro

es convexo si su superficie

es visible desde todo punto

de su interior.

21

Page 22: Libro de Geometria Computacional

Geometría Computacional

El poliedro más simple

es el tetraedro (formado por

cuatro caras triangulares).

El tetraedro regular y el cubo, dos de los cinco poliedros regulares

I.8 Operaciones con vectores

Casi sin excepción, los algoritmos geométricos requieren de operaciones con vectores. Se incluyen a continuación las más comunes. En todos los casos se ha considerado que la base de los vectores se encuentra en el origen. La aplicación a casos generales es inmediata desplazando primero el vector al origen.

I.8.1 Módulo de un vector

Es el tamaño del vector y se calcula como: sqrt(x2 + y2 + …)

I.8.2 Suma de dos vectores

La suma de dos vectores es otro vector, cuyas

componentes son la suma una a una de las

componentes de los vectores originales:

22S1

S2

x1 x2

y2

y1

Page 23: Libro de Geometria Computacional

Geometría Computacional

En 2D:

S1+S2: [x1,y1] + [x2, y2] = [x1+x2, y1+y2]

Igualmente

S1-S2: [x1,y1] - [x2, y2] = [x1-x2, y1-y2] Suma de vectores en 2D

I.8.3 Producto escalar

El producto escalar de dos vectores es un número

real y se lo define como:

[x1,y1] . [x2, y2] = x1.x2 + y1.y2

Se puede demostrar que

S1 . S2 = S2 . S1 = |S1|.|S2|.cos

Esta propiedad resulta muy útil para calcular el ángulo entre dos vectores. En efecto es la forma más económica de hacerlo.

I.8.1 Producto cruzado o producto vectorial

El producto vectorial de dos vectores es otro vector de módulo|S1 x S2| = |S1|.|S2|.sin

23

y

x

S1

S2

Page 24: Libro de Geometria Computacional

Geometría Computacional

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:

(y1.z2-z1.y2) i

(z1.x2-x1.z2) j

(x1.y2-y1.x2) k

S1 x S2 : [y1.z2 - z1.y2, z1.x2 - x1.z2, x1.y2 - y1.x2]

I.9 Algunas aplicaciones del producto vectorialI.9 Algunas aplicaciones del producto vectorial

I.9.1 Cálculo de áreas

24

x

y

S1

S2

S1 x S2=

Page 25: Libro de Geometria Computacional

Geometría Computacional

El módulo de S1 x S2 es igual al área del paralelogramo formado por los dos vectores. En el caso de 2D esta área puede entonces calcularse sin necesidad de evaluar una raíz cuadrada, ya que el vector resultante solo tiene componente Z:

A = x1.y2 - y1.x2

Esta es la forma usual de calcular el área de un triángulo: At = (x1.y2 - y1.x2)/2

Dado entonces tres puntos, la función en C que evalúa esta área se puede escribir

como:

struct Point {double x,y; };

double area_triang (Point p0, Point p1, Point p2)

{

double area;

area = (p1.x-p0.x)*(p2.y-p0.y) – (p1.y-p0.y)*(p2.x-p0.x);

return area*0.5;

}

También puede utilizarse para calcular el área de cualquier polígono, ya que como se dijo, un polígono puede ser descompuesto en un conjunto de triángulos. Dado que esta descomposición puede no ser simple de plantear, 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).

25

Page 26: Libro de Geometria Computacional

Geometría Computacional

Nótese que el punto no tiene porque estar dentro del polígono. Algunas de las áreas de triángulos podrán tener valor negativo, pero es simple comprobar que la sumatoria de todas ellas dará como resultado el área del polígono, y que este no tiene porque ser convexo.

I.9.2 Punto interior a un polígono convexo

Dado un segmento [P1,P2] y un punto P, el producto

vectorial puede utilizarse para saber si el

punto está a la derecha o a la izquierda

del segmento:

Si [P2 - P1] x [P - P1] > 0 => izquierda

Caso contrario => derecha

Utilizando esta propiedad, si el punto se encuentra a la izquierda de todos los segmentos que forman el polígono, entonces el punto es interior. Como el polígono se asumió que es convexo, basta que el punto esté a la derecha de un solo segmento para que se considere que está fuera del polígono.

I.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

26

P

P2

P1

Page 27: Libro de Geometria Computacional

Geometría Computacional

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”. Luego se

ordena los puntos según valores crecientes

de cos() y se define la polilínea uniendo

los puntos en este orden.

Dado que el cálculo de cos () requiere evaluar el módulo de cada segmento

[Pi-P0], 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?”

I.10 Otros Algoritmos ImportantesI.10 Otros Algoritmos Importantes

I.10.1 Intersección entre dos segmentosI.10.1 Intersección entre dos segmentos

Interesa saber si dos segmentos en el plano { [x1,y1], [x2,y2] }, { [x3,y3], [x4,y4] } se cortan. Dado que en algunos problemas esta operación se realiza un número muy

27

Page 28: Libro de Geometria Computacional

Geometría Computacional

grande de veces (se pueden tener millones de pares de segmentos por ejemplo), interesa determinar si hay o no corte en la forma más eficiente posible.

Normalmente en las aplicaciones que interesan, estos millones de segmentos tienen baja probabilidad de cortarse, ya que se tratan de situaciones como la de la figura a) y no como la de la figura b).

En estos casos, un primer chequeo que vale la pena aplicar es verificar que las bounding-box de los segmentos tengan alguna superposición. 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

Donde:

xs1max : coordenada X máxima del primer segmento

xs1min : coordenada X mínima del primer segmento

28

a) b)

Page 29: Libro de Geometria Computacional

Geometría Computacional

Si bien en los casos en que efectivamente hay corte, este análisis agrega 8 operaciones inútiles. En general con solo tres o cuatro operaciones se están descartando la gran mayoría de los casos.

Ahora bien, este test solo descarta muchos casos en los que no hay corte, pero no puede asegurar más que eso. Para efectivamente determinar si hay o no corte puede utilizarse alguno de los dos algoritmos que se describen a continuación.

Alg. 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. En el caso de que estén del mismo lado, necesariamente no hay corte. En caso contrario se repite la operación tomando ahora el otro segmento y el otro par de puntos. Si también en este caso queda un punto de cada lado del segmento, entonces hay corte, caso contrario no lo hay.

La figura muestra las diferentes situaciones que pueden darse (sin tener en cuenta los casos “patológicos”, en que algún punto de un segmento se encuentra sobre la recta del otro):

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, en el segundo el segmento S1 cumple el test, pero no así el S2; en el tercer caso S2 cumple el test, pero no S1. 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.

El algoritmo requerirá 20 operaciones para indicar que hay un corte.

Alg. 2:

29

S1

S2

S1 S1

S1S2 S2

S2

Page 30: Libro de Geometria Computacional

Geometría Computacional

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 + B

A y B son coeficientes a determinar. Dados [x1,y1] y [x2,y2] del segmento se resuelve:

y1 = A.x1 + B

y2 = A.x2 + B

=> A = (y2-y1) / (x2-x1) B = y1 – A.x1

Dados los dos segmentos => dos ec. de rectas (A1,B1), (A2,B2)

Igualando las dos ecuaciones de recta =>

A1.x + B1 = A2.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.

Este algoritmo requiere prácticamente la misma cantidad de operaciones que el anterior, pero además de indicar si hay o no corte, permite calcular las coordenadas del punto de corte.

I.10.2 Búsqueda del polígono que contiene un puntoI.10.2 Búsqueda del polígono que contiene un punto

30

Page 31: Libro de Geometria Computacional

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, pero es fácil ver que si el polígono es no-convexo, ese algoritmo puede fallar. Por otro lado, los requerimientos más corrientes plantean un problema levemente distinto: interesa encontrar cual es el polígono que contiene un punto dado, y en muchos casos la cantidad de polígonos presentes puede ser muy elevada.

Veamos primero como manejar el caso de polígonos no convexos:

I.10.2.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. Si el número es par, entonces el punto es exterior y si es impar se encuentra en el interior.

Como cualquier semi recta es válida, en general se utiliza una horizontal al eje X y en dirección positiva, ya que una semi recta general requeriría más operaciones.

Hasta aquí todo bien, 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?

31

Cuatro cortes => OUT

Un corte => IN

2

1

Page 32: Libro de Geometria Computacional

Geometría Computacional

Es claro que el algoritmo así planteado fallará en estos casos. 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. 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). Se comienza a recorrer el contorno calculando con cada vértice el producto vectorial para saber si se cambió de lado. Cuando se produce un cambio, se incrementa el contador de número de cortes y se cambia el estado de la variable lado. 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). Si el resultado 0.0 para el producto vectorial no se considera cambio, 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). Para el caso de la semi recta 1 de la figura no detectará corte, mientras que para el 2 y el 3 detectará correctamente un corte.

I.10.2.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. El algoritmo obvio en este caso sería recorrer todos los polígonos y analizar si el punto es interior al mismo. Su costo computacional será por lo tanto proporcional al número de polígonos presentes.

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. 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). La descripción se

32

3

Page 33: Libro de Geometria Computacional

Geometría Computacional

realiza en 2D y las entidades geométricas que se clasifican son polígonos, pero su extensión a más dimensiones u otras entidades es trivial.

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, donde cada lista contiene los polígonos que intersecan esa celda. Una vez que este arreglo ha sido creado, encontrar el polígono que contiene al punto (suponiendo que alguno lo contiene) se divide en dos etapas:

a) Encontrar la celda [i, j] que contiene al punto [x,y], 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.

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, el segundo paso también tiene un costo computacional constante. En casos donde el tamaño de los polígonos es bastante uniforme y equidistribuidos en el espacio, esto se consigue tomando M N sqrt (NumPolig).

33

N

Page 34: Libro de Geometria Computacional

Geometría Computacional

El costo computacional de generar la estructura de datos es proporcional al número de polígonos, por lo que esta técnica será conveniente de utilizar cuando la cantidad de puntos que se analizarán es lo suficientemente grande.

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). En la figura se muestra un caso no tan violento, pero que permite visualizar el problema:

Una estructura de datos interesante para estos casos es el empleo de quad-trees. 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. La raíz del árbol representa un rectángulo que incluye completamente este dominio.

34

Page 35: Libro de Geometria Computacional

Geometría Computacional

Una representación posible para un vértice de este árbol sería:

struct vertice

{

double xc, yc, tamx, tamy;

struct vertice *TL, *TR, *BL, *BR;

};

35

TL TR

BL BR

TL TR BL BR

Page 36: Libro de Geometria Computacional

Geometría Computacional

Las variables xc, yc indican la posición del centro de la celda, dato necesario para poder descender por el árbol en busca de la celda que contiene un punto dado. El 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) //Si TL es NULL => no tiene ningun hijo

{

if (x < vert->xc)

if (y < vert->yc) vert = vert->BL;

else vert = vert->TL;

else

if (y < vert->yc) vert = vert->BR;

else vert = vert->TR;

}

return vert;

}

UNIDAD II : PRIMITIVOS GRAFICOS

36

Modelos para cirugías

 

Pero no es el diagnóstico por imágenes la única ayuda de la matemática a la ciencia médica.

Por dar solamente algunos ejemplos más, mencionemos que las simulaciones numéricas computacionales se aplican ya en:

 

Modelos para cálculo de tensiones en cirugía ocular:

Visualización y animación computarizada

Para darse alguna idea de lo que esto significa, consideremos la descripción del Fields Intitute en Toronto (Canadá): ‘La animación computarizada es una ciencia ecléctica que combina de manera singular: matemática, ciencia de la computación, arte, animación clásica, física, biomecánica y anatomía, por nombrar sólo algunos campos. Los algoritmos dependen fuertemente en técnicas de computación científica, estadística, procesamiento de señales, álgebra lineal, teoría de control, y geometría

Otros ejemplos de aplicación de la matemática...

El análisis y optimización del tráfico de las redes de comunicación e Internet.

La compresión y tratamiento de imágenes.

Identificación de patrones en grandes masas de datos.¿Cómo sirve la matemática a otras disciplinas?

La matemática suministra modelos a las distintas áreas del conocimiento.

 

¿Pero qué significa esto?

 

Modelar significa encontrar una representación matemática para un objeto, un proceso o un sistema no matemático, construyendo una teoría o estructura matemática que incorpora sus características esenciales. El modelo construido, de tipo matemático, permite obtener resultados acerca del proceso en cuestión.

 

Actualmente, los modelos se simulan en computadoras de manera de poder predecir resultados sin la

Primero es necesario construir mallas de resolución discreta de la ecuación alrededor del objeto (geometría computacional, CAD).

Estudio por Elementos Finitos de combustión

interna

Luego, complejas teorías de análisis numérico son necesarias para resolver numéricamente la ecuación.

Los cálculos son tan extensos que el análisis debe efectuarse en sistemas computacionales de alto rendimiento y en

Finalmente, analizar y visualizar los datos y resultados que son típicamente grandes y, eventualmente, modificar o crear nuevos modelos y/o métodos de resolución.

¿Qué más hay de matemática aplicada?

Álgebra y Teoría de Números: criptografía, mensajes cifrados y seguridad informática.

Dinámica computacional de fluidos: diseño, aviones, automóviles.

Ecuaciones diferenciales: aerodinámica, vibraciones.

Matemática discreta: comunicaciones, informática.

Sistemas formales y lógica: seguridad computacional, verificación.

Geometría computacional: ingeniería computacional, diseño, análisis de imágenes.

Control no lineal: operaciones de sistemas

¿Qué tipo de problemas quiere resolver? Allí estará la matemática

 

En problemas como

¿Cómo se puede optimizar el tráfico de enormes cantidades

de datos en las comunicaciones de banda ancha confiablemente?

¿Cómo alocar inversiones en varios instrumentos financieros

minimizando el riesgo?

¿Cómo una proteína o una enzima toma una determinada

forma molecular? ¿dónde están los sitios activos en la molécula?

La matemática no es una mera especulación intelectual, sino que estudia problemas concretos cuyos resultados representan un significativo aporte al acervo cultural y tecnológico de la humanidad y revelan el papel cada vez más importante que juega esta ciencia en el mundo actual.

 

La capacidad de la matemática para modelar la realidad de manera simbólica la convierten en una herramienta indispensable para la comprensión de los objetos y procesos de estudio. Por más que se crea que “...en ¿Qué sucede en Argentina con la matemática aplicada?

Todo lo escrito anteriormente parece una pintura solamente de los países altamente desarrollados y es claro que 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 modelos.

 

Ya hay empresas privadas o institutos que requieren activamente el desarrollo de este rubro: SIDERCA, IMPSA, CIMEC, INVAP, etc., y es de esperar que las exigencias aumenten considerablemente.

 

Para tener una mejor idea de los problemas reales en empresas que se resuelven en Argentina es útil consultar la página Web del Centro de Mecánica Computacional de Santa Fé (CIMEC)

 

http://www.cimec.org.ar

Page 37: Libro de Geometria Computacional

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.

37

Page 38: Libro de Geometria Computacional

Geometría Computacional

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 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 Paleta de Colores

38

Page 39: Libro de Geometria Computacional

Geometría Computacional

Ahora veremos como funciona la paleta de colores, para poder cambiar nosotros mismos los colores y así poder personalizarnos un programa, o por ejemplo cuando cargamos una imagen, que también es necesario poner la paleta de esa imagen.

Vamos empezar viendo como funciona lo de la paleta de colores, que control un chip llamado DAC (Digital Analog Converter), para así conseguir hacer efectos de paleta, pero estos lo encontraras en la sección de efectos (hacer link). 

Como ya sabemos en el modo 13h disponemos de una paleta de 8 bits, o sea, 256 colores. Cada color se consigue a basa de mezclar tres componentes para ir consiguiendo así diferentes tonalidades. Así tenemos que un color está formado por tres colores básicos, el rojo, verde y azul. Estos tres colores pueden tener un máximo de 64 tonalidades, desde el 0 (más oscuro) hasta el 63 (más claro).

Esto es así porque el sistema que se utiliza es el denominado RGB  (Red, Green, Blue), que es el que el monitor utiliza para representar el color de un pixel, ya que este posee tres haces de luz, una haz rojo, otro verde y uno azul, los cuales apuntan a una sola posición que es lo que conocemos como el haz de electrones, y mezclándose se consigue crear el color deseado. Si queremos conseguir un color gris bastará con poner los valores RGB a la misma intensidad cada uno. Veamos un ejemplo, si queremos que el color 0 sea negro entonces utilizamos los valores (0, 0, 0), o si queremos que sea blanco colocamos los valores (63, 63, 63). Y si lo que queremos es que sea de color rojo intenso ponemos (63, 0, 0) y así se puede jugar con los valores.

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. 144 (64^3) diferentes, pero solo podremos representar simultáneamente 256, ya que

39

Page 40: Libro de Geometria Computacional

Geometría Computacional

la profundidad es de 8 bits y lo máximo que podemos representar en un byte es el valor 255 (0-255).

Pero como podemos cambiar los colores, bueno como dije antes el chip encargado de esta tarea es el DAC o Digital Analog Converter, cuya misión es la de transformas las señales digitales del computador a señales analógicas que utiliza el monitor. Para acceder a este chip y olvidarnos de la BIOS la cual dispone de funciones para trabajar con la paleta, nosotros usaremos tres puertos, a través de los cuales podremos leer y escribir las diferentes componentes de los colores. Estos registros son el 03C7h, el 03C8h y el 03C9h. En el siguiente cuadro podrás encontrar la descripción detallada de cada uno:

Como vemos, para leer el valor actual de un color, lo que tendríamos que hacer es, primero, enviar al puerto 3C7h, el número de color del que queremos obtener los 3 valores, y luego, obtener y leer tres valores del puerto 3C9h, que corresponderán a los valores RGB del color número x que indicamos en el puerto 3C7h. Y si lo que queremos es cambiar los valores RGB de un determinado color, lo que haremos será primero enviar al puerto 3C8h el número del color a cambiar, y después enviar los valores RGB al puerto 3C9h. A continuación veremos las rutinas correspondientes en C, para cambiar y leer los valores RGB de un color determinado.

40

Page 41: Libro de Geometria Computacional

Geometría Computacional

void SetColor(unsigned char color, char r, char g, char b) {     outportb(0x3C8, color);

    outportb(0x3C9, r);      outportb(0x3C9, g);      outportb(0x3C9, b);  }

Y para leer los valores RGB de un color, se haría así:

void GetColor(unsigned char color, char *r, char *g, char *b) {     outportb(0x3C7, color);

    *r=inportb(0x3C9);      *g=inportb(0x3C9);      *b=inportb(0x3C9);  }

Ya sabemos cambiar los colores, ahora veremos como serían las rutinas para cambiar o obtener una paleta. Antes de esto debemos crear una estructura que nos permita guardar las paleta, 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];

o incluso se podría crear un tipo de dato llamado t_paleta, para así hacer mas fácil las declaraciones de paletas en los programas que realicemos, esto sería así:

typedef  char t_paleta[768];

de esta forma, cuando queramos crear una variable que guarde la paleta, en este caso llamada pal, simplemente la declararíamos así:

t_paleta pal;

La rutina modificar la paleta sería así: void SetPal(t_paleta pal) {   int i;

41

Page 42: Libro de Geometria Computacional

Geometría Computacional

  for(i=0; i<256; i++)     SetColor(i, pal[i*3], pal[(i*3)+1], pal[(i*3)+2]); }

Lo que se hace aquí es recorrer los 256 colores, y por cada uno ir cambiando las intensidades RGB correspondientes.

Y por último la rutina para obtener una paleta: void GetPal(t_paleta pal) {   int i;

  for(i=0; i<256; i++)     GetColor(i, &pal[i*3], &pal[(i*3)+1], &pal[(i*3)+2]); }

En esta rutina se hace simplemente lo contrario a la rutina SetPal. Nuevamente recorremos los 256 colores, y por cada uno vamos obteniendo las intensidades RGB de cada color. Cuando llamamos a la rutina GetColor debemos pasarle los valores RGB por referencia, es decir la dirección, para que de esta forma salgan modificados. Lo que haría en realidad la rutina GetPal sería obtener la paleta activa que se encuentra en el sistema.

II.2 Librerías Gráficas

C/ graphics.h

Es suficiente con incluir la librería grafica y con colocar las siguientes líneas dentro de la función main, 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! , con lo cual ya tenemos habilitada la librería gráfica.

#include<graphics.h>

int gdriver = DETECT, gmode, errorcode;//Inicialización del modo grafico

42

Page 43: Libro de Geometria Computacional

Geometría Computacional

initgraph (&gdriver, &gmode, "c:\\tc\\bgi");

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.

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).

#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>

int main(void){ /* Requiere auto detección */ int gdriver = DETECT, gmode, errorcode; int midx, midy; int radius = 100;

/* Inicializa las variables locales y los graficas */ initgraph(&gdriver, &gmode, "");

/* Lee el resultado de la inicialización */ errorcode = graphresult(); if (errorcode != grOk) /* Si ocurre algún error */ { printf("Error grafico: %s\n", grapherrormsg(errorcode)); printf("Presionar una tecla para salir:"); getch(); exit(1); /* Codigo de error */ }

midx = getmaxx() / 2; midy = getmaxy() / 2; setcolor(getmaxcolor());

/* Dibuja un circulo */ circle(midx, midy, radius);

getch(); closegraph(); return 0;

43

Page 44: Libro de Geometria Computacional

Geometría Computacional

}

II.2.1 Funciones de las Librerías Gráficas

Graphics.h

FUNCION SETBKCOLOR

void setbkcolor (int color);

Esta función es usada para asignar el color de fondo especificado por el argumento color. Existen varios valores para ciertos colores de fondo.

La funcion setbkcolor no retorna ningún valor.

Ejemplo:

#include <stdio.h>#include <conio.h>#include <dos.h>#include <graphics.h>void main (){int adap=DETECT,modo;initgraph(&adap,&modo,"C:\\tc20\\bin ");setbkcolor(4);circle(300,150,50);getch();restorecrtmode();getch();}

FUNCION GETBKCOLOR

Int getbkcolor (void);

44

Page 45: Libro de Geometria Computacional

Geometría Computacional

Esta función es usada para obtener el valor del color de fondo actual. El color de fondo, por defecto, es el color 0. Sin embargo, este valor puede cambiar con una llamada a la funcion setbkcolor. Existen varios valores para ciertos colores de fondo.

La función getbkcolor retorna el valor del color de fondo actual.

Ejemplo:

#include <stdio.h>#include <conio.h>#include <dos.h>#include <graphics.h>void main (){int adap=DETECT,modo,color;initgraph(&adap,&modo,"C:\\tc20\\bin ");setbkcolor(6);circle(300,150,50);color=getbkcolor();getch();printf("el color de fondo es:%d\n",color);restorecrtmode();getch();}

void setcolor (int color)

Esta función coloca el atributo color es decir escoge un color entre 0 y 15 su equivalente en ingles, todo lo que dibuje después de esta instrucción tendra el color establecido por la funcion setcolor, el valor de esta es WHITE.

Esta funcion no devuelve ningún valor.

Ejemplo:

#include <stdio.h>

45

Page 46: Libro de Geometria Computacional

Geometría Computacional

#include <conio.h>

#include <dos.h>#include <graphics.h>void main (){int adap=DETECT,modo;initgraph(&adap,&modo,"C:\\tc20\\bin ");setcolor(1);circle(300,150,50);getch();restorecrtmode();}

FUNCION CLEARDEVICE (VOID)

void cleardevice (void);

Esta funcion es usada para despejar la pantalla grafícala funcion cleardevice

Usa el color de fondo actual, como es establecida por la funcion setbkcolor , para rellenar la pantalla. La posición del cursor grafico es la esquina superior izquierda de la pantalla posición (0,0) después de que la pantalla haya sido borrado.

La funcion cleardevice no retorna ningún valor.

Ejemplo:

#include <stdio.h>#include <conio.h>#include <dos.h>#include <graphics.h>void main (){int adap=DETECT,modo,relleno,color;initgraph(&adap,&modo,"C:\\tc20\\bin ");relleno=1;color=1;setlinestyle(SOLID_LINE,relleno,THICK_WIDTH);

46

Page 47: Libro de Geometria Computacional

Geometría Computacional

circle(300,200,80);getch();setbkcolor(color);cleardevice();setlinestyle(SOLID_LINE,relleno,THICK_WIDTH);circle(400,200,20);getch();closegraph();getch();restorecrtmode();}

Funcion getmaxx:

Int getmaxx(void);

Esta función es usada para obtener la coordenada máxima de al pantalla en la dirección horizontal. 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.

Ejemplo:

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

void main ()

{

int adap=DETECT,modo,x_max;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

x_max=getmaxx();

47

Page 48: Libro de Geometria Computacional

Geometría Computacional

closegraph();

printf("x máxima:%d\n",x_max);

getch();

}

FUNCION GETMAXY:

Int getmaxy(void);

Esta función es usada para obtener la coordenada maxima de la pantalla en la dirección vertical. Este valor suele ser la resolución vertical máxima menos 1.

La funcion getmaxy retorna la coordenada maxima de la pantalla en la dirección vertical.

Ejemplo:

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

void main ()

{

int adap=DETECT,modo,x_max,y_max;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

x_max=getmaxx();

y_max=getmaxy();

closegraph();

printf ("x máxima: %d\ty máxima: %d\n", x_max, y_max);

48

Page 49: Libro de Geometria Computacional

Geometría Computacional

getch();

}

RELLENOS:

Es el proceso de rellenar una región de la pantalla con un patrón o color. Turbo C utiliza dos métodos para definir la región de relleno. El primer relleno de polígonos, usa la lista de vértices del polígono para calcular la geometría del interior, el segundo relleno es por el método de inundación, 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.

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.

FUNCION BAR

void bar (int izq, int sup, int der, int inf);

Esta función dibujara una barra rectangular y rellenada de dos dimensiones.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. Similarmente, los argumentos derecha e inferior definen la esquina inferior derecha de la barra. La barra no tiene borde, pero es rellenada con la trama de relleno

Actual y el color de relleno como es establecido por la funcion setlinestyle.

La funcion bar no retorna ningún valor.

Ejemplo:

#include <stdio.h>

#include <conio.h>

49

Page 50: Libro de Geometria Computacional

Geometría Computacional

#include <dos.h>

#include <graphics.h>

void main ()

{

int adap=DETECT,modo,x,y,color,fill;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

x=20;

y=20;

color=1;

fill=1;

do{

setfillstyle(fill,color);

bar(x,y,x+40,320);

x+=40;

y+10;

color=(color+1) % 16;

fill=(fill+1) % 12;

}while(x<620);

getch();

closegraph();

getch();

}

50

Page 51: Libro de Geometria Computacional

Geometría Computacional

FUNCION SETFILLSTYLE:

void setfillstlyle (int trama, int color);

Esta función es usada para seleccionar una trama predefinida y un color de relleno. El argumento trama específica la trama predefinida, mientras que el argumento color especifica el color de relleno. Existen trece valores ya definidos para tramas. Sin embargo, la trama (valor 12) no debería usarse para asignar una trama definida por el usuario. En su lugar, se debería usar la función setfillpattern.

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

Ejemplo:

#include <graphics.h>

#include <conio.h>

void main () {

int driver = EGA,modo = EGAHI;

initgraph( &driver, &modo, "c:\\tc20\\bin" );

setfillstyle( LTSLASH_FILL, 6 );

bar( 50, 50, 350, 300 );

getch(); /* Pausa */

closegraph();

}

FUNCIÓN SETFILLPATTERN

void setfillpattern (char *trama, int color);

Esta función es usada para seleccionar una trama de relleno definido por el usuario. El argumento *trama apunta a una serie de ocho bytes que representa una trama de relleno de bits de 8 x 8. Cada byte representa una fila de ocho bits,

51

Page 52: Libro de Geometria Computacional

Geometría Computacional

donde cada bit está encendido o no (1 ó 0). Un bit de 0 indica que el píxel correspondiente será asignado el color de relleno actual. Un bit de 0 indica que el píxel correspondiente no será alterado. El argumento color específico el color de relleno que será usado para la trama.

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

Ejemplo:

#include <graphics.h>

#include <conio.h>

void main() {

int driver = EGA,modo = EGAHI;

char trama1[8] = { 0x33, 0xEE, 0x33, 0xEE, 0x33, 0xEE, 0x33, 0xEE };

char trama2[8] = { 0x0A, 0xF0, 0xF0, 0x0A, 0x0A, 0xF0, 0xF0, 0x0A };

initgraph( &driver, &modo, "C:\\tc20\\bin" );

bar( 50, 50, 150, 150 );

setfillpattern( trama1, 9 );

bar( 160, 50, 260, 150 );

setfillpattern( trama2, 4 );

bar (105, 160, 205, 260);

getch(); /* Pausa */

closegraph();

}

52

Page 53: Libro de Geometria Computacional

Geometría Computacional

RELLENO POR MEDIO DE UN POLÍGONOS:

void fillpoly (numpuntos, int *puntos);

Esta función es usada para crear un polígono rellenado. El argumento numpuntos es usado para definir el número de puntos en el polígono. Al contrario que la función drawpoly, la función automáticamente cierra el polígono. El argumento *puntos apunta a un array de números de longitud numpuntos multiplicado por 2.

Los dos primeros miembros del array identifica las coordenadas x e y del primer punto, respectivamente, mientras que los dos siguientes especifican el siguiente punto, y así sucesivamente. La función fillpoly dibuja el perímetro del polígono con el estilo de línea y color actuales. Luego, el polígono es rellenado con la trama de relleno y color de relleno actuales.

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

Ejemplo:

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

void main() {

int driver = EGA,modo = EGAHI,trama, color;

int puntos[6] = { 300, 50, 500, 300, 100, 300 };

initgraph( &driver, &modo, "C:\\tc20\\bin" );

trama = SLASH_FILL;

for(color=0;color<=15;color++)

{

53

Page 54: Libro de Geometria Computacional

Geometría Computacional

setfillstyle( trama, color );

fillpoly( 3, puntos );

getch();

}

getch(); /* 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*/

RELLENO POR EL MÉTODO DE INUNDACIÓN:

void floodfill (int x, int y, int borde);

Esta función es usada para rellenar un área cerrado con el color de relleno y trama de relleno actuales. Los argumentos x e y especifican el punto de comienzo para el algoritmo de relleno. El argumento borde especifica el valor del color del borde del área. Para que la función fillpoly Funcione como es esperado, el área a ser rellenado debe estar rodeada por el color especificado por el argumento borde. Cuando el punto especificado por los argumentos x e y se encuentra dentro del área a ser rellenada, el interior será rellenado. Si se encuentra fuera del área, el exterior será rellenado.

Nota: Esta función no Funciona con el driver IBM-8514.La función floodfill no retorna ningún valor.

Ejemplo:

54

Page 55: Libro de Geometria Computacional

Geometría Computacional

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

void main() {

int driver = EGA,modo = EGAHI,trama, color;

int puntos[8] = { 300, 50, 500, 300, 100, 300, 300, 50 };

initgraph( &driver, &modo, "C:\\tc20\\bin" );

setcolor( 10 ); /*verde*/

drawpoly( 4, puntos );

trama = SLASH_FILL;

for(color = 0;color<=15;color++)

{

setfillstyle( trama, color );

floodfill( 400, 250, 10 );

getch();

}

getch(); /* Pausa */

closegraph ();

}

MOUSE.H

Todas la librerias aquí explicadas aparecen el la carpeta include de turbo C de tc20. Para comenzar tenemos:

La función mver();

55

Page 56: Libro de Geometria Computacional

Geometría Computacional

Void mver(void)

La función mver muestra el puntero del ratón no es necesario en viar ningún parámetro.

La función mver no 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(); }while(!kbhit());closegraph();getch();}

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;

56

Page 57: Libro de Geometria Computacional

Geometría Computacional

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ámetroretorna: 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.

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:

57

Page 58: Libro de Geometria Computacional

Geometría Computacional

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; 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);} }}

58

Page 59: Libro de Geometria Computacional

Geometría Computacional

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){ int adaptador=DETECT,modo; int x,y; char *strx, *stry; 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);

59

Page 60: Libro de Geometria Computacional

Geometría Computacional

outtextxy(100,100,strx); outtextxy(100,120,stry); setcolor(WHITE);} }}

LA FUNCIÓN MSITUAR:

Void msituar (int modo, int x, 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, x,y.

Modo: 1 para modo gráfico.8 para modo texto.

X: posición horizontal.Y: posición vertical.

La función no 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");msituar(1,310,240); /*Coloca el cursor en el centro de la pantalla*/do{ mver(); }while(!kbhit());

closegraph();getch();}

60

Page 61: Libro de Geometria Computacional

Geometría Computacional

LA FUNCIÓN MCLICK:

Int mclick (void)

Nos dice si se ha pulsado un botón del Mouse, no es necesario enviar un parámetro.

Retorna 0 si no es presionado ningún botón. 1 si se presionó el botón izquierdo del Mouse. 2. si se presionó el botón derecho del Mouse.

Ejemplo:

#include<graphics.h>#include<stdlib.h>#include<conio.h>#include<mouse.h>void main(){int adaptador=DETECT,modo,x,y;initgraph(&adaptador,&modo,"c:\\tc20\\BIN");do{

mver(); x=mxpos(1); y=mypos(1); if(mclick()==1)

{ setcolor(GREEN); outtextxy(x+30,y,"Diste un click izquierdo");}if(mclick()==2) { setcolor(RED); outtextxy(x+30,y,"Diste un click derecho");}delay(10000); setcolor(BLACK); outtextxy(x+30,y,"Diste un click izquierdo"); outtextxy(x+30,y,"Diste un click derecho");

}while(!kbhit());

closegraph();getch();}

61

Page 62: Libro de Geometria Computacional

Geometría Computacional

LA FUNCIÓN MLIMIT Void mlimit (int modo, int ) ;

Esta función limita el espacio de movilización del cursor (ratón), en esta función es necesario enviar cinco parámetros modo,x1,y1,x2,y2.

Modo: 1 para modo gráfico.8 para modo texto.

X1: límite de arriba.Y1: límite abajo.X2: limite de abajoY2: 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.

Ejemplo:

#include<graphics.h>#include<conio.h>#include<mouse.h>void main(){int adaptador=DETECT,modo;initgraph(&adaptador,&modo,"c:\\tc20\\BIN");do{ outtextxy(100,50,"Dibuja‚ el rectángulo para que observaran el limite");

rectangle(100,100,500,400);mlimit(1,100,100,500,400); mver();

}while(!kbhit());

closegraph();

62

Page 63: Libro de Geometria Computacional

Geometría Computacional

getch();}

LA FUNCIÓN MINLIMIT

void minlimit(int modo, int x1, inty1, int x2, 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.

Modo: 1 para modo gráfico.8 para modo texto.

X1: límite de arriba.Y1: límite abajo.X2: limite de abajoY2: límite de la derecha

Retorna 1 si esta en esa área en caso contrario regresará 0 (cero).

Ejemplo:

#include<graphics.h>

#include<conio.h>

#include<mouse.h>

void main()

{

int adaptador=DETECT,modo;

initgraph(&adaptador,&modo,"c:\\tc20\\BIN");

setbkcolor(BLUE);

do{ setcolor(WHITE);

63

Page 64: Libro de Geometria Computacional

Geometría Computacional

outtextxy(210,105,"pasa el mouse por encima del bot¢n y veras el efecto");

mver();

rectangle(100,100,200,120);

if(minlimit(1,100,100,200,120)==1)

{

outtextxy(310,240,"Haz pulsado el rat¢n por encima del bot¢n");

delay(30000);

setcolor(BLACK);

outtextxy(310,240,"Haz pulsado el rat¢n por encima del bot¢n");

}

}while(!kbhit());

closegraph();

getch();

}

64

Page 65: Libro de Geometria Computacional

Geometría Computacional

II.3 Primitivos Gráficos

II.3.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ínea, o circulo; pueden ser un carácter, o pueden se una operación tal como relleno, coloreado o transferido de la imagen. C cuenta con cinco grupos de primitivos gráficos.

Figuras Geométricas: Dibujan las figuras de geometría clásica: líneas, círculos, arcos, rectángulos, polígonos, etc.

Relleno: Tiene dos formas de realizarse. El primero es con polígonos, 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.

Rasterop: Es una operación grafica que copia el área de una imagen para luego dibujarla en cualquier región de la pantalla.

Graficas Matemáticas: Dibuja los primitivos barras y sectores para conseguir dibujar las herramientas del sector.

Texto Grafico: Sirve para escribir texto en modo grafico, utilizando diferentes fuentes.

65

Page 66: Libro de Geometria Computacional

Geometría Computacional

II.3.2 FIGURAS GEOMETRICAS

LINEAS

void line (int x1, int y1, int x2, int y2);

Esta función es usada para conectar dos puntos con una línea recta. El primer punto es especificado por los argumentos x1 e y1. El segundo punto es especificado por los argumentos x2 e y2.La línea se dibuja usurado el estilo de la línea actual, el grosor y el color actual. La posición del cursor actual grafico no es afectada por la función line.

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

Ejemplo:

#include <stdlib.h>

#include <conio.h>

#include <graphics.h>

#include <stdio.h>

void main ()

{

int adap=DETECT,modo;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

66

Page 67: Libro de Geometria Computacional

Geometría Computacional

line(0,0,getmaxx()/2,getmaxy()/2);

getch ();

closegraph();

}

CIRCULO

void circle(int x, int t, int radio);

Esta función se utiliza para dibujar un círculo. Los argumentos x e y definen el centro del circulo, mientras que el argumento radio define el radio del circulo. El círculo no es rellenado pero es dibujado usando el color actual.

El grosor de la circunferencia puede ser establecido por la funcion setlinestyle; sin embargo, el estilo de la línea es ignorado por la funcion circle.

La funcion cirlce no retorna ningún valor.

Ejemplo:

#include <stdlib.h>

#include <conio.h>

#include <graphics.h>

#include <stdio.h>

67

Page 68: Libro de Geometria Computacional

Geometría Computacional

void main ()

{

int adap=DETECT,modo;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

circle (300,200,80);

getch();

closegraph();

}

RECTANGULOS

void rectangle(int izquierda, int superior, int derecha, int inferior);

Esta funcion dibujara un rectángulo sin rellenar su interior usando el color actual. La esquina superior izquierda del rectángulo esta definida por los argumentos izquierdos y superiores. Estos argumentos corresponden a los valores x e y de la esquina superior izquierda. Similarmente, 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.

La funcion rectangle () no retorna ningún valor.

Ejemplo:

#include <stdlib.h>

#include <conio.h>

68

Page 69: Libro de Geometria Computacional

Geometría Computacional

#include <graphics.h>

#include <stdio.h>

void main ()

{

int adap=DETECT,modo;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

rectangle(40,40,400,300);

getch();

closegraph();

}

ARCOS

void arc(int x, int y, int comienzo_angulo, int final_angulo, int radio);

Esta función creara un arco circular. El arco tiene como centro el punto especificado por los argumentos x e y, y es dibujado con el radio especificado: radio. El arco no esta rellenado, pero es dibujado usando el color actual . 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. La función arc Saa el este (extendiéndose hacia la derecha del centro del arco en la dirección horizontal como su punto de 0 grados. La función setlinestyle puede usarse para establecer el grosor del arco. La fusión arc sin embargo, ignorara el argumento trama de la función setlinestyle.

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

69

Page 70: Libro de Geometria Computacional

Geometría Computacional

Ejemplo:

#include <stdlib.h>

#include <conio.h>

#include <graphics.h>

#include <stdio.h>

void main ()

{

int adap=DETECT,modo,radio;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

for (radio=200;radio<254;radio +=200)

{

arc(320,240,45,150,radio);

getch();

closegraph();

}

}

PIXELES

void putpixel(int x, int y, int 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 . El argumento color específico, el valor del color.

70

Page 71: Libro de Geometria Computacional

Geometría Computacional

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

Ejemplo:

#include <stdlib.h>

#include <conio.h>

#include <graphics.h>

#include <stdio.h>

void main ()

{

int adap=DETECT,modo,t;

initgraph(&adap,&modo,"C:\\tc20\\bin ");

for (t=0;t<200;t++)

{

putpixel(100+t,50+t,RED);

getch();

closegraph();

}

}

ELIPSES:

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

71

Page 72: Libro de Geometria Computacional

Geometría Computacional

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();

getch();

closegraph();

}

72

Page 73: Libro de Geometria Computacional

Geometría Computacional

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);

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.

73

Page 74: Libro de Geometria Computacional

Geometría Computacional

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);

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. La línea se dibuja usando el estilo de línea actual, el grosor, y el color actual. Después de que la línea recta haya sido dibujado, 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).

74

Page 75: Libro de Geometria Computacional

Geometría Computacional

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

Ejemplo:

#include <graphics.h>

#include <conio.h>

void main() {

int adap, modo ;

initgraph( &adap, &modo, "C:\\tc20\\bin" );

moveto( 20, 20 );

lineto( 40, 60 );

lineto( 80, 90 );

getch();

closegraph();

}

FUNCIÓN MOVEREL

void moverel(int dx, int dy);

Esta función es usada para mover la posición del cursor gráfico a una distancia relativa como los argumentos dx y dy. El argumento dx define la distancia relativa a moverse en la dirección horizontal. El argumento dy define la distancia relativa a moverse en la dirección vertical. Estos valores pueden ser positivos o negativos. No se dibuja ya que el cursor es mudado.

75

Page 76: Libro de Geometria Computacional

Geometría Computacional

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

Ejemplo:

#include <graphics.h>

#include <conio.h>

void main() {

int driver = DETECT,modo;

initgraph( &adap, &modo, "C:\\tc20\\bin" );

moveto( 20, 20 );

linerel( 20, 40 );

moverel( 50, 50 );

linerel( 40, 30 );

getch();

closegraph();

}

FUNCIÓN LINEREL

void far linerel(int dx, int dy);

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. El argumento dx específica el número relativo de píxel para atravesar en la dirección horizontal. El argumento dy específica el número relativo de píxeles para atravesar en la

76

Page 77: Libro de Geometria Computacional

Geometría Computacional

dirección vertical. Estos argumentos pueden ser tanto valores positivos como negativos. La línea se dibuja usando el estilo de línea actual, el grosor, y el color actual desde la posición actual del cursor gráfico a través de la distancia relativa especificada. Cuando la línea esté terminada, la posición del cursor gráfico es actualizado al último punto de la línea.

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

Ejemplo:

#include <graphics.h>

#include <conio.h>

void main() {

int driver = EGA,modo = EGAHI;

initgraph( &driver, &modo, "C:\\tc20\\bin" );

moveto( 20, 20 );

linerel( 20, 40 );

linerel( 40, 30 );

getch();

closegraph();

}

FUNCIÓN GETX

int getx(void);

77

Page 78: Libro de Geometria Computacional

Geometría Computacional

Esta función es usada para obtener la posición, en la dirección horizontal, del cursor gráfico. El valor retornado especifica el lugar del píxel horizontal del cursor gráfico (la coordenada x), relativo a la pantalla del usuario actual.

La función getx retorna la coordenada x del cursor gráfico.

Ejemplo:

#include <graphics.h>

#include <stdio.h>

void main() {

int adap, modo, x, y;

initgraph( &adap,&modo, "C:\\tc20\\BIN" );

moveto( 300, 150 );

x = getx();

y = gety();

closegraph();

printf (“Cursor gráfico\n\nX: %d\tY: %d\n", x, y);

}

FUNCIÓN GETY

78

Page 79: Libro de Geometria Computacional

Geometría Computacional

int far gety(void);

Esta función es usada para obtener la posición, en la dirección vertical, del cursor gráfico. El valor retornado especifica el lugar del píxel vertical del cursor gráfico (la coordenada y), relativo a la pantalla del usuario actual.

La función gety retorna la coordenada y del cursor gráfico.

Ejemplo:

#include <graphics.h>

#include <stdio.h>

void main() {

int adap, modo, x, y;

initgraph( &adap, &modo, “C:\\TC20\\BIN” );

moveto( 300, 150 );

x = getx();

y = gety();

printf (“Cursor gráfico\n\nX: %d\tY: %d\n", x, y);

closegraph();

getch();

}

79

Page 80: Libro de Geometria Computacional

Geometría Computacional

Funciones de Rasterop

Las funciones del rasterop, son aquellas que realizar la acción de mover una imagen ya sea transportando una imagen o copiándola.

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.

Procederemos a explicar cada una de ellas para realizar buestros ejercicios de movimiento.

FUNCIÓN IMAGESIZE

unsigned far imagesize(int izquierda,int superior, int derecha, int inferior);

Esta función es usada para determinar el tamaño del búfer necesitado para almacenar una imagen con la función getimage. Los argumentos izquierda y superior definen las coordenadas x e y de la esquina superior izquierda de la imagen rectangular. Similarmente, los argumentos derecha y inferior definen las coordenadas x e y de la esquina inferior derecha de la imagen rectangular.

La función imagesize retorna el número actual de bytes necesarios, si el tamaño requerido es menor que 64 Kb menos 1 byte. Si esto no es el caso, el valor retornado es 0xFFFF, ó -1.

80

Page 81: Libro de Geometria Computacional

Geometría Computacional

Ejemplo:

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

#include "stdio.h"

void main() {

int adap=DETECT;

int modo = EGAHI;

void *imagen;

int imagentam;

initgraph( &adap, &modo, “C:\\tc20\\BIN” );

setfillstyle( SLASH_FILL, WHITE);

bar( 50, 50, 350, 300 );

imagentam = imagesize( 50, 50, 100, 100 );

closegraph();

getch();

}

/*En este ejercicio solo calculamos el tamaño de la imagen*/

FUNCIÓN MALLOC

void *malloc(size_t size)

Función definida en conio.h. El tamaño está en bytes. Regresa un puntero(indicador)al bloque recientemente asignado, o Nulo (NULL) si no existe

81

Page 82: Libro de Geometria Computacional

Geometría Computacional

suficiente espacio en nuevo bloque. Si el tamaño==0, este regresa un Nulo(NULL) .

Ejemplo:

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

void main()

{

int adap =DETECT;

int modo = EGAHI;

void *imagen;

/*int imagentam;*/

initgraph( &adap, &modo, "C:\\tc20\\BIN");

setfillstyle( SLASH_FILL, WHITE);

bar( 50, 50, 350, 300 );

/*imagentam = imagesize( 50, 50, 100, 100 );*/

imagen = malloc(imagesize( 50, 50, 100, 100 ));

free( imagen );

getch();

closegraph();

}

/* getch();*/

82

Page 83: Libro de Geometria Computacional

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, int superior, int derecha, int inferior, void far *imagen);

Esta función es usada para guardar una porción rectangular de la pantalla para un uso posterior. La esquina superior izquierda del área rectangular que ha de ser guardada está definida por los argumentos izquierda y superior. Estos argumentos representan las coordenades x e y de la esquina superior izquierda, respectivamente. Los argumentos derecha e inferior definen la esquina inferior derecha de la imagen rectangular. Estos argumentos definen las coordenades x e y de la esquina inferior derecha, respectivamente. El argumento *image apunta al búfer de memoria donde la imagen está guardada.

La función getimage no retorna ningún valor, directamente.

Ejemplo:

#include <graphics.h>

#include <conio.h>

#include <stdlib.h>

void main() {

int adap = DETECT;

int modo = EGAHI;

void *imagen;

int imagentam;

initgraph( &adap, &modo, "C:\\tc20\\BIN" );

setfillstyle( SLASH_FILL,WHITE );

bar( 50, 50, 350, 300 );

imagentam = imagesize( 50, 50, 100, 100 );

83

Page 84: Libro de Geometria Computacional

Geometría Computacional

imagen = malloc( imagentam );

getimage( 50, 50, 100, 100, imagen );

free( imagen );

getch();

}

/*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 , int superior, void far *image, int acción);

Esta función coloca una imagen que fue previamente guardada con la función getimage en la pantalla. La esquina superior izquierda donde será colocada la imagen está definida por los argumentos izquierdos y superiores. Estos argumentos representan las coordenadas x e y de la esquina superior izquierda, respectivamente. El argumento *image apunta al búfer de memoria donde la imagen está guardada. La imagen se coloca en la pantalla con la acción definida en el argumento acción. Los valores y consonantes usados por el argumento acción se describen a continuación ya que pudieron haberlos olvidado:

Constante Valor Significado

COPY_PUT 0 Sobrescribir los píxeles existentes

XOR_PUT 1 Operación OR Exclusivo con los píxeles

OR_PUT 2 Operación OR Inclusivo con los píxeles

AND_PUT 3 Operación AND con los píxels

NOT_PUT 4 Invertir la imagen

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

84

Page 85: Libro de Geometria Computacional

Geometría Computacional

Ejemplo:

include <graphics.h>

#include <conio.h>

#include <stdlib.h>

void main() {

int adap =DETECT,modo = EGAHI, imagentam;

void *imagen;

initgraph( &adap, &modo, "C:\\tc20\\BIN" );

setfillstyle( SLASH_FILL,WHITE );

bar( 50, 50, 350, 300 );

imagentam = imagesize( 50, 50, 100, 100 );

imagen = malloc( imagentam );

getimage( 50, 50, 100, 100, imagen );

putimage( 400, 50, imagen, COPY_PUT );

getch();

putimage( 400, 110, imagen, COPY_PUT );

getch(); /* Pausa */

closegraph();

free( imagen );

getch();

}

85

Page 86: Libro de Geometria Computacional

Geometría Computacional

UNIDAD III: TRIANGULACION DE POLIGONOS

III.1 Definición de Polígonos

Polígonos es la porción de plano limitada por una línea poligonal cerrada.

Elementos

1) Lados: Son los segmentos rectilíneos que lo limitan: AB, BC, CD, DE, etc.

2) Vértices: Son las intersecciones de dos lados consecutivos, los vértices son: A, B, C, D, etc.

3) Ángulos interiores: Son los ángulos formados por dos lados consecutivos.

4) Ángulos exteriores: Son los ángulos formados en un vértice por un lado y la prolongación del lado consecutivo.

5) Diagonales: Son líneas rectas que unen dos vértices no consecutivos. AD, AC, BE

6) Perímetro: Es la longitud total de su contorno ó es la suma de sus lados.

86

Page 87: Libro de Geometria Computacional

Geometría Computacional

III.2 Clasificación de Polígonos por la forma de su contorno

Convexos: Son aquellos polígonos, en los que al atravesarlos una recta lo cortan en un máximo de dos puntos.

Cóncavos: Son aquellos polígonos, en los que una recta al atravesarlos pueden cortar en más de dos puntos.

Equiláteros: Son los polígonos que tienen todos sus lados iguales.

Equiángulos: Son los polígonos que tienen sus ángulos iguales.

Regulares: Son los polígonos que tienen sus ángulos y sus lados iguales entre sí.

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.

Propiedades de los polígonos

1ra.

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:

87

Page 88: Libro de Geometria Computacional

Geometría Computacional

3ra

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 - 3) diagonales; de los "n" vértices se podrán trazar n(n - 3)

88

Page 89: Libro de Geometria Computacional

Geometría Computacional

diagonales, pero todo sobre dos, pues cada diagonal corresponde a dos vértices diferentes

8va

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.

9naLa suma de los ángulos exteriores de un polígono cóncavo es igual a 4 ángulos rectos.

Construcción de polígonos

Los polígonos son las superficies planas limitadas por rectas que se cortan dos a dos.

Se clasifican en regulares, si sus lados y ángulos son iguales, e irregulares.

Los polígonos cóncavos son aquellos que tienen alguno de sus ángulos interiores mayor de 180º.

Las diagonales son las rectas que unen dos vértices no consecutivos.

89

Page 90: Libro de Geometria Computacional

Geometría Computacional

Segmento de línea

Un segmento de línea es un subconjunto cerrado de una línea contenido entre dos Puntos, los cuales son llamados puntos finales, el subconjunto se dice cerrado en El sentido de que este incluye los puntos finales.

Polígono (Definición matemática)

Sean V0, V1, V2, V3,… Vn-1, ‘n’ puntos en el plano y sean e0= V0V1, e1= V1V2,…ei= ViVi+1,… en-1 = Vn-1V0, ‘n’ segmentos conectando los puntos, entonces estos Segmentos limitan un polígono si y solo si:

1- La intersección de cada par de aristas adyacentes en el orden cíclico es un simple punto compartido entre ellos. ei ∩ ei+1= Vi, para todo i=0,… n-i

2-) Los segmentos no adyacentes no se intersectan.

90

Page 91: Libro de Geometria Computacional

Geometría Computacional

ei ∩ ej = Φ, para todo i=0 ≠j

a)b)

Notación de un Polígono

- Puntos Vi, 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

91

e3

V4

e2

e1

e0

e5

e4

V3

V2

V1

V0

V5

V0

V2

V4 V3

V1

No se cumple la

segunda condición

e0 ady e1 intersección V1

e1 ady e2 intersección V1

e2 ady e3 intersección V1

e3 ady e4 intersección V1

e4 ady e5 intersección V1

e5 ady e0 intersección V1

V1

V2

V3V4

V5

V0

c)

La interior no es vacía

(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

Page 92: Libro de Geometria Computacional

Geometría Computacional

Teorema: Cada curva cerrada simple (Polígono) divide el plano en dos partes.Las dos partes son llamadas el interior y el exterior de la curva.

- El exterior es ilimitada- El interior es limitada

n = # de vérticesVi = vértices iei = Arista# Vértices = # de Aristas

∂P (Delta P) = FronteraDel polígono

III.3 Teorema de la Galería de Arte

Hoy en día las salas de los nuevos museos no tienen, en general, formas regulares en sus plantas, lo que da lugar a interesantes problemas de iluminación.

Si la planta fuera un polígono convexo, una única fuente de iluminación bastaría para iluminar toda la sala, pero la irregularidad impide esta solución económica.

Así se plantea el problema de minimizar el nº de luces que son necesarias parailuminar la sala.

92

1

2

3

4

5

6

7

8

9

10

0

Interior

∂P

Etiquetar en sentido antihorario los vértices

Exterior

Arista

Vértice

Page 93: Libro de Geometria Computacional

Geometría Computacional

Figura 1. Iluminando distintas salas

Los problemas de iluminación han atraído la mirada de los matemáticos desdehace tiempo. Mencionemos aquí dos de ellos:

Problema de Hadwiger

¿Cuántos reflectores se necesitan para iluminar el contorno exterior de una figura plana, compacta, convexa y de borde liso? Boltyanski probó en 1960 que tres reflectores son siempre suficientes.

Problema de Strauss

Pensemos en una sala de planta poligonal cuyas paredes son espejos. ¿Es cierto que basta colocar una fuente luminosa en cualquier punto de la sala parailuminarla completamente?. ¿Habrá siempre un punto con esa propiedad?

Recientemente Tokarsky [To] ha probado que la respuesta a la primera pregunta es negativa. Pero la segunda parte de la conjetura permanece abierta.

Volvamos al problema de iluminación de una sala en un museo. La cuestión fueplanteada por V. 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.

93

Page 94: Libro de Geometria Computacional

Geometría Computacional

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, quiendemostró que n/3 guardias siempre son suficientes.

En 1978, Fisk dio una demostración concisa y elegante que ampliaremos más adelante: Triangúlese el polígono, 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.

El problema así resuelto es de naturaleza combinatoria pues responde a lageneralidad de los polígonos de n lados. Sin embargo no todos los polígonos de n lados requieren ese nº de guardias (por ejemplo, cualquier convexo de n lados sólo requiere un guardia). Por ello tiene sentido plantear el siguiente problema algorítmico: Dado un polígono P, calcular el mínimo nº de guardias que lo vigilan.

Desgraciadamente no existe ningún algoritmo eficiente que lo resuelva, pues Lee y Lin [LL] han probado que es un problema de complejidad NP. (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)

Tras conocer la respuesta al problema planteado por Klee surgen de modoinmediato multitud de nuevas preguntas: ¿Qué sucede si el objeto a vigilar es un tipo especial de polígono, o si se quiere iluminar el exterior del polígono o, más general, de una configuración de objetos? Estas preguntas corresponden a variantes del Problema en las que cambia el objeto a vigilar.

Pero también podemos modificar las características de los guardias o de los focos de luz. En el problema original los guardias son estáticos, vigilan en todas las direcciones y su vigilancia tiene alcance ilimitado.

Permitiendo, por ejemplo, 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.

94

Page 95: Libro de Geometria Computacional

Geometría Computacional

Figura 2. Diferentes formas de vigilar o iluminar.

En este artículo comenzaremos con la demostración de Fisk del denominadoTeorema de las Galerías de Arte y presentaremos después algunas de lasvariantes mencionadas.

Para vigilar una galería de arte poligonal con n vértices, (n/3) guardias sonsiempre suficientes. Existen salas que necesitan ese nº de guardias.

Demostración. (Fisk [Fi])

Consideremos un polígono simple P de n vértices y observemos gráficamente los siguientes pasos, anticipados en la introducción:

95

Page 96: Libro de Geometria Computacional

Geometría Computacional

Primer paso. (Triangulación)

Triangulamos P, es decir, descomponemos P en triángulos cuya unión es P, con interiores disjuntos y cuyos vértices son vértices de P. Observamos que unguardia situado en cualquier vértice de un triángulo vigila completamente dichotriángulo.

Segundo paso. (Coloración)

La triangulación anterior es un grafo plano. El Teorema de los cuatro colores,probado en 1976 por Appel y Haken, asegura que todo grafo plano puedecolorearse utilizando sólo cuatro colores. Pero podemos colorear los vértices de una triangulación T de un polígono utilizando tan sólo tres colores. (Unacoloración de un grafo es una asignación de colores a los vértices del grafo demodo 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.

Tercer paso. (Colocación de guardias)

Cada triángulo de T tiene un vértice rojo. Si colocamos un guardia en cadavértice rojo, vigilarán todos los triángulos y, por tanto, todo el polígono. Lomismo sucederá si colocamos guardias en todos los vértices negros o si loscolocamos en todos los vértices azules.

El polígono tiene n vértices y disponemos de 3 colores. Por tanto, alguno de lostres colores, rojo, negro o azul se utiliza en, a lo más, (n/3) vértices. (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, sumando los vértices de cada colortendríamos más de n vértices).

Basta pues, colocar los guardias en los vértices con el color menos utilizado para garantizar que (n/3) guardias son siempresuficientes para vigilar cualquier polígono de n vértices.

Cuarto paso (Necesidad de los (n/3) guardias)

Para comprobar que este número deguardias es a veces necesario, bastaconsiderar el polígono "peineta" con

96

Page 97: Libro de Geometria Computacional

Geometría Computacional

n=3k vértices de la Figura 4. Es fácilobservar que para vigilar este polígonose necesitan al menos k guardias, unopor cada púa de la peineta.

Figuras de peine

‘k’ puntos = G(n) por cada punto un guardan=3k , k= n/3 , G(n)= n/3

Un peine consiste de ‘k’ puntas cada punto está compuesta de dos aristas ylas puntas adyacentes están separadas por una arista, asociando c/ puntacon la arista de separación a su derecha y la arista del fondo con la punta mas a la derecha.

Observamos que un peine de ‘k’ puntos tiene n=3k aristas y por lo tanto vértices,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 Ay B que son claramente visibles uno al otro, la intersección del segmento cerradoAB son frontera del polígono, es exactamente el conjunto {a, b} .Diagonal no cruzada:

Dos diagonales son llamadas no cruzadas si su intersección es un subconjunto desus puntos finales, ellas no comparten puntos interiores.

Si se agregan tantas diagonales no cruzadas a un polígono como sea posible el inferior del polígono es particionarlo en triángulos, tal partición es denominada laTriangulación de un polígono.

97

Page 98: Libro de Geometria Computacional

Geometría Computacional

III.4 Teoría de Triangulación

En primer lugar, definiremos de una manera formal lo que es un polígono.

Un polígono P es una secuencia cerrada de segmentos y se representa por una secuencia de vértices p = (p0, p1,..., pn-1), donde pi tiene unas coordenadas (x,y).

Los segmentos (pi,pi+1), 0 ≤ i ≤ n-1, son las aristas de P.

***Un polígono es simple si dos aristas no consecutivas no se intersecan.

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.

Supondremos que los vértices vienen dados en el orden de las agujas del reloj, por lo que el interior del polígono está a la derecha de los vértices.

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.

98

0

1

2

3

4

56

7

8

9

1011

1213

14

15

16

17

18

19

20

Diagonales

no cruzadas

Page 99: Libro de Geometria Computacional

Geometría Computacional

Propiedad 1. Todo polígono se puede triangular.Demostración.

Por inducción sobre n, nº de vértices del polígono. Si n=3, el polígono ya es un triángulo.Si n≥4, se traza una diagonal cualquiera que descompone el polígono P en otros dos con menor nº de vértices. 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.

Analicemos la frase: "se traza una diagonal.....". ¿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.

LemaTodo polígono de n vértices, n≥4, admite una diagonal interna.

Demostración.En primer lugar observamos que todopolígono tiene algún vértice convexo (porejemplo, el situado más a la izquierda).Llamemos A a dicho vértice y B y C a susadyacentes. Si el segmento BC está contenido en el polígono P será la diagonal buscada. Si no es así, en el triángulo ABC habrá vértices de P. Tomamos el más alejado X de la recta BC. Así AX está contenido en P y es la diagonal buscada.

(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. El lector puede construir un polígono en el que AZ no es una diagonal válida).

Propiedad 2Cualquier triangulación de un polígono es un grafo plano 3-coloreable.

Demostración.Sea P un polígono y T(P) una triangulación de P. Demostraremos el resultado por inducción sobre n, número de vértices del polígono P.Si n=3, la triangulación coincide con P y la 3-coloración es obvia.

99

Page 100: Libro de Geometria Computacional

Geometría Computacional

Si n>3 se toma una diagonal uv que parte T(P) en dos polígonos trianguladosT(P’) y T(P’’) cuyo nº de vértices es menor que n. Por inducción podemoscolorear las triangulaciones de P’ y P’’ asignando en ambas el color 1 al vértice u y el color 2 a v. Así tenemos una 3-coloración de T(P).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.

Existen muchos algoritmos para triangular polígonos simples que difieren en las complejidades de sus peores casos, en las complejidades de sus descripciones y en las estructuras de datos que utilizan.

Ejemplos de ellos son:

Triangulación por búsqueda de diagonales, Triangulación por el método de la otectomía (escisión de orejas), etc.

Pero, antes de decidir qué algoritmo es el más adecuado para nuestro problema, debemos tener en cuenta que los polígonos que surgen cuando se elimina el conjunto de vértices independientes en un nivel de la jerarquía tienen una propiedad especial: son polígonos estrellados.

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, i=1...N.

Figura 4: Polígono estrellado.

100

Page 101: Libro de Geometria Computacional

Geometría Computacional

Este tipo de polígonos son menos generales que los polígonos simples, y además pueden ser triangulados en un tiempo lineal.

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".

Un vértice pi de un polígono simple P es una oreja si el segmento (pi-1, pi+1) es una diagonal. Diremos que dos orejas pi y pj no se superponen si el interior del triángulo (pi-1, pi, pi+1) no interseca el interior del triángulo (pj-1, pj, pj+1).

Triangulación de un polígono

Primera aproximación al problema:

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,i2,n,P ) ) ENTONCES

Pintar( P[i],P[i2] )

EliminaVertice ( i1,P,n )

Triangular ( P,n-1 )

FIN_SI

FIN_PARA

FIN_SI

FIN

101

Page 102: Libro de Geometria Computacional

Geometría Computacional

La triangulación se produce uniendo vértices del polígono.

algoritmo obtiene una triangulación del mismo.

1. Defínase

T (P) = P

si P es un triángulo.

2. En caso contrario, hállese T (P) recursivamente mediante:

a) Sean pi y pk tal que (pi, pk) es una diagonal interior de P (suponemos, sin pérdida de generalidad, que i < k).

b) Sean

A = (pi, pi+1, . . . , pk) y B = P \ A

c) Hállese

T (P) = T (A) U T (B)

3. T (P) es la triangulación buscada.

En la práctica computacional, la triangulación de un polígono se representa mediante índices.

Esto es:

Si (pi, pj , pk) es uno de los triángulos, la representación consiste en la lista de índices (i, j, k).

Teorema de las dos orejas

Excepto los triángulos, cada polígono simple tiene, al menos, dos orejas que no se superponen.

102

Page 103: Libro de Geometria Computacional

Geometría Computacional

Este teorema crea las bases de las triangulaciones basadas en el algoritmo de poda de orejas.

El algoritmo encuentra una oreja en el polígono, la corta y recursivamente triangula el resto del polígono.

El algoritmo de recortado de orejas es el siguiente:

1. Mientras que el polígono P tenga más de 3 lados:

1.1. Buscar vértice oreja Pi, en el polígono P.

1.2. Añadir arista (Pi-1,Pi+1) a la triangulación.

1.3. Eliminar Pi del polígono P, lo que supone la poda de la oreja.

Existen diversos métodos para encontrar un vértice oreja en el polígono. En este caso se ha utilizado la búsqueda de oreja en O(kn), cuyo algoritmo es el siguiente:

1. i:=0

2. Mientras que el vértice Pi no sea una oreja

2.1. 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, Pi, Pi+1)

Pies una oreja

2.2. 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, y su complejidad es de O(kn), 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.

103

Page 104: Libro de Geometria Computacional

Geometría Computacional

III.5 Área de Polígonos/ Intersección de segmentos

IMPLEMENTACIÓN

# define x 0 /* Coord en x*/

# define y 1 /* Coord en y*/

typedef enum { FALSE, TRUE } bool; /* Tipo bool*/

# define DIM 2 /* Dimensión de un punto*/

# define PMAX 50 /*Cantidad máxima de vértices para un Polígono*/

104

Page 105: Libro de Geometria Computacional

Geometría Computacional

typedef int tpointi [DIM]; /* Tipo punto*/ /*Representación de un punto*/

typedef tpointi tpolygoni [PMAX]; /*Tipo Polígono*/

long area2 (tpointi a, tpointi b, tpointi c)

{

long area;

area = (b[0] – a[0]) * (c[1] – a[1]);

area = (b[1] – a[1]) * (c[0] – a[0]);

return(area);

}

Área (T) = ½ A x B

2 Área (T) = A x B

Área De un Triangulo

105

Page 106: Libro de Geometria Computacional

Geometría Computacional

/

*IMPLEMENTACION DEL ÁREA DE UN TRIANGULO*/

long area2 (int a[ ], int b[ ], int c[ ])

106

Page 107: Libro de Geometria Computacional

Geometría Computacional

{

long area;

area= (b[0] –a[0]) * (c[1] – a[1]);

area= (c[0] – a[0]) *(b[0] – a[1]);

return (area);

}

/* Esta función corresponde al cálculo del área de un triángulo */

Para el código de las aristas

107

Page 108: Libro de Geometria Computacional

Geometría Computacional

Filosofía de los casos especiales

108

Page 109: Libro de Geometria Computacional

Geometría Computacional

Predicado de izquierda:

Una recta es determinada por dos puntos dados en un orden particular

(a, b), si un punto ‘c’ está a la izq. de la línea determinada por (a, b) la tripleta (a, b, c) forma un circuito cerrado en sentido anti – horario.

El punto ‘c’ está a la izq. de (a, b) si y solo si el triángulo tiene área +.

bool Reft (int a[ ], int b[ ], int c[ ])

{

109

Page 110: Libro de Geometria Computacional

Geometría Computacional

return(area2 (a, b, c) > 0);

}

bool leftOn (int a[ ], int b[ ], int c[ ])

{

return(area2 (a, b, c) > = 0);

}

bool collinear (int a[ ], int b[ ], int c[ ])

{

return(area2 (a, b, c) = = 0);

}

Colinealidad:

Note que al igual que en la actividad interactiva, cuando los tres puntos son colineales, si el punto B está entre los puntos A y C, el ángulo ABC mide 180º.

Ya se ha visto como determinar si tres puntos son colineales y que se puede utilizar el ángulo entre los tres puntos para determinarlo, pero este criterio no es posible de aplicar para más de tres puntos, por lo que la definición de puntos colineales se puede generalizar de la siguiente manera.

Definición:

Dos o más puntos son colineales si  existe una sola recta que los contenga.

110

Page 111: Libro de Geometria Computacional

Geometría Computacional

Definición:

Dos o más puntos son no colineales si  no existe una sola recta que los contenga.

Casos de Intersección

Intersección propia:

Si dos segmentos a, b, y c, d se intersecan en un punto interior c y d

son divididos por las líneas l1 conteniendo a, b y c, que están a la Derecha

de a, b y d están a la Izq. de la misma forma a y b son divididos por

las línea l2 conteniendo a c, d.

Evaluó si esta a la

izquierda o a la derecha.

Se tienen que analizar los cuatro puntos para decir que los segmentos están intersectados.

111

Page 112: Libro de Geometria Computacional

Geometría Computacional

bool Intersect prop(int a[ ], int b[ ], int c[ ], int d[ ])

{

if (collinear (a, b, c) ¦¦ collinear (a, b, d) ¦¦ collinear (c, d, a) ¦¦ collinear (c,d ,b))

return (FALSE);

return (XOR(left (a, b, c), left(a, b, d) && XOR left (c, d, a); left (c, d, b)))

}

Intersección impropia:

Una intersección impropia ocurre precisamente cuando el punto final

de un segmento descansa en alguna parte del otro segmento.

112

Page 113: Libro de Geometria Computacional

Geometría Computacional

bool Between (int a[ ], int b[ ], int c[ ])

{

if ( !collinear (a, 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])));

}

113

Page 114: Libro de Geometria Computacional

Geometría Computacional

bool Intersect (int a[ ], int b[ ], int c[ ], int d[ ])

{

if ( Intersect prop (a, b, c, d))

return (TRUE);

else

if between (a, b, c)

¦¦ between (a, b, d)

¦¦ between (c, d, a)

¦¦ between (c, d, b))

return (TRUE);

else

return (FALSE);

}

ANALISIS DE INTERIORIDAD DE LA DIAGONAL

1- La diagonal es interna a través de toda la longitud.

2- Basta analizar la interioridad en la vecindad de sus puntos finales.

3- Solamente las aristas que inciden en los extremos de la diagonal deben ser analizados.

114

Page 115: Libro de Geometria Computacional

Geometría Computacional

4- Analizar solamente unos de sus extremos donde la diagonal incide.

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.

Á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º.

115

Page 116: Libro de Geometria Computacional

Geometría Computacional

Note que en un polígono de "n" lados hay "n" ángulos llanos (prolongando cada uno de sus lados), observe además, que cada ángulo llano es la suma de un ángulo interno y un ángulo externo, por lo tanto, la suma de los ángulos externos está dada por la suma de los ángulos llanos menos la suma de los ángulos internos.

ANGULO CONVEXO

Si d es una diagonal deber ser completamente interna al Polígono. (Basta que tomamos una distancia corta de lo que son sus extremos) de los dos extremos dónde la diagonal incide tomaremos solo uno.

116

Page 117: Libro de Geometria Computacional

Geometría Computacional

Determinar si la diagonal es interna al cono, si v- esta a la izquierda de la diagonal y v+ esta a la derecha de j, i.

ANGULO CONVEXO

Mientras no este interna al cono la diagonal será interna. Si es interior la diagonal será externa.

117

Page 118: Libro de Geometria Computacional

Geometría Computacional

118

Page 119: Libro de Geometria Computacional

Geometría Computacional

III. 6 Algoritmo de Triangulación

Algoritmo elemental O(n3)Triangular (S,n)Si n>3EntoncesPara i=0 hasta n1RepetirSi sisi+2Entonces sisi+1si+2 es un triánguloeliminar si+1Triangular (S,n1)Fin_siFin_paraFin

III.7 Transformaciones Geométricas

En la unidad II fueron presentadas algunas funciones para dibujar primitivos gráficos y controlar sus atributos.

Con estas se puede crear una gran variedad de gráficas estáticas, pero muchas aplicaciones requieren modificar tamaño, forma y posición de un objeto en la pantalla.

En las aplicaciones interactivas, podría desearse probar la apariencia de un objeto en la pantalla, reacomodando su posición o tamaño antes de fijarlo.

119

Page 120: Libro de Geometria Computacional

Geometría Computacional

En programas de animación, hay que dar un movimiento continuo a los objetos animados en la pantalla.

En programas de dibujo/diseño asistido por computadora, se requiere formar un proceso para traducir los modelos, en unidades del mundo real, a coordenadas de la pantalla.

La solución para realizar estas diversas manipulaciones de figuras es usar transformaciones geométricas, que permiten formalizar el proceso de manipular estas figuras para alcanzar el efecto deseado.

Una transformación es una entidad matemática, escrita con un sólo símbolo, tal como "T", que se usa para transformar un punto, generando así uno nuevo. Por ejemplo, si P es un punto, de la transformación de P por T resulta un punto P'. En la notación matemática, este proceso se escribe:

P * T = P'

Las transformaciones sirven para manipular figuras que se definen con un conjunto de puntos o vértices, tales como líneas, polígonos, y otras figuras basadas también en puntos, líneas y polígonos. Para manipular una figura, se aplican las transformaciones a la definición de la figura antes de desplegarla, y no a la imagen desplegada de la figura.

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, se presentarán varias transformaciones; algunas que son generalizaciones de las básicas y otras que son de su propia clase.

TRASLACIÓN

Traslación es una transformación que desplaza un objeto por una distancia y dirección determinadas, a partir de su posición original.

Una traslación se define con un par de coordenadas (Tx,Ty) que se llaman distancias de traslación o bien vector de traslación, donde Tx representa un

120

Page 121: Libro de Geometria Computacional

Geometría Computacional

desplazamiento en la dirección x y Ty representa un desplazamiento en la dirección y.

Si T = (Tx,Ty) es una transformación de traslación, entonces la traslación por T de un punto P (x,y) produce un nuevo punto P' (x',y') donde:

x' = x + Tx

y' = y + Ty

(III.1)

En la notación de transformaciones, esta operación se escribe

P * T = P'

Ejemplo III.1: Traslación

Trasladar por T(40,20) el triángulo que tiene vértices

P1 = (20,20)

P2 = (100,20)

P3 = (100,100)

Note que para trasladar cualquier polígono, es suficiente trasladar sus puntos terminales.

P1 * T = (20+40, 20+20) = (40,60)

P2 * T = (100+40, 20+20) = (140,40)

P3 * T = (100+40, 100+20) = (140,120)

Note que el triángulo cambia de posición, pero guarda su tamaño y orientación.

121

Page 122: Libro de Geometria Computacional

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.

Una escalación E = (Ex,Ey) se define en términos de factores de escalación Ex y Ey para las direcciones horizontal y vertical, respectivamente. De la escalación de un punto P(x,y) por E resulta un punto P'(x',y'):

x' = Ex * x

y' = Ey * y

(III.2)

Los factores de escalación pueden tener cualquier valor positivo. Un factor de escalación < 1 disminuye el objeto; un factor = 1 conserva el tamaño; y un valor > 1 agranda el objeto.

Cuando Ex = Ey se produce una escalación uniforme; de otro modo, se distorsionan las proporciones del objeto. 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.

Para escalar un polígono, se escala cada vértice independientemente por los factores de escalación.

Ejemplo III.2: Escalación

Escalar por E(2.0,0.5) el triángulo que tiene vértices

P1 (20,20)

P2 (100,20)

122

Page 123: Libro de Geometria Computacional

Geometría Computacional

P3 (100,100)

Aplicando la transformación a cada uno de los vértices:

P1 * E = (20*2.0,20*0.5) = (40,10)

P2 * E = (100*2.0,20*0.5) = (200,10)

P3 * E = (100*2.0,100*0.5) = (200,50)

La figura III.2 muestra el triángulo original (línea punteada) y final (línea continua).

Note que la escalación causa un desplazamiento neto al triángulo como efecto lateral.

Esto se debe a que la escalación modifica el espacio coordenado entero, con respecto al origen. Es decir, cualquier disminución de un punto lo acerca al origen, y cualquier agrandamiento de un punto lo aleja del origen.

El origen es el único punto que no se desplaza. Esta escalación con respecto al origen es un caso especial de la escalación general, con respecto a un punto arbitrario llamado "punto fijo", tema que se aborda posteriormente.

La escalación con respecto al origen se usa como caso básico porque las ecuaciones son más sencillas.

Rotación es una transformación que desplaza un objeto en una trayectoria circular centrada alrededor del origen. En la transformación de rotación se especifica el ángulo Θ a girar, donde la dirección positiva lleva sentido antihorario.

Para derivar las ecuaciones de la rotación, usaremos la figura III.3. En esta figura φ es el ángulo original del punto P(x,y) desde la horizontal y Θ es el ángulo de rotación que se quiere aplicar a P. El punto resultante es P'(x',y'). Usando las rela-

123

Page 124: Libro de Geometria Computacional

Geometría Computacional

ciones de los lados de los triángulos, podemos conseguir expresiones para (x,y) y (x',y') en términos de r y los ángulos φ y Θ:

x = r cos (φ)

y = r sin (φ) (III.3)

x' = r cos (Θ + φ)

y' = r sin (Θ + φ) (III.4)

Aplicando las leyes del seno y coseno de la suma de dos ángulos a (III.4) tenemos:

x' = r [cos(Θ) cos(φ) - sen(Θ) sen(φ)]

y' = r [sen(Θ) cos(φ) + cos(Θ) sen(φ)]

Sustituyendo las ecuaciones (III.3) en (III.4), se reemplaza r cos(φ) por x, y r sen(φ) por y:

x' = (r cos(φ)) cos(Θ) - (r sen(φ)) sen(Θ)

= x cos(Θ) - y sen (Θ)

y' = (r cos(φ)) sen(Θ) + (r sen(φ)) cos(Θ) (III.5)

= x sen (Θ) + y cos (Θ)

Estas ecuaciones son la forma final para la transformación de rotación. Para girar un polígono por un ángulo Θ, es suficiente girar cada vértice independientemente por Θ.

El punto central con respecto al cual se gira, se llama punto pivote. El uso del origen como punto pivote es un caso especial que se usa porque las ecuaciones resultan más sencillas. El caso de un punto pivote arbitrario se trata más adelante.

Ejemplo III.3: Rotación

Girar por 30° el triángulo que tiene vértices:

P1 = (50,25)

124

Page 125: Libro de Geometria Computacional

Geometría Computacional

P2 = (150,25)

P3 = (150,75)

Dado que el seno y coseno para este ángulo son:

cos (30°) = 0.87

sen (30°) = 0.5

se pueden solucionar las ecuaciones:

P1 * R(30°) = (50 * 0.87 - 25 * 0.5, 50 * 0.5 + 25 * 0.87)

= (31,47)

P2 * R(30°) = (150 * 0.87 - 25 * 0.5, 150 * 0.5 + 25 * 0.87)

= (117,97)

P3 * R(30°) = (150 * 0.87 - 75 * 0.5, 150 * 0.5 + 75 * 0.87)

= (92,140)

UNIDAD IV: PARTICIONAMIENTO DE POLIGONOS

IV.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.

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’.

Axioma:

125

Page 126: Libro de Geometria Computacional

Geometría Computacional

Si un polígono no tiene cúspide interior entonces es monótono.

Triangulación de polígonos monótonos

Método óptimo para triangulación de polígonos:1.Convertirun polígono en particiones monótonas2.Triangularcada una de estas particiones monótonasUn polígono P es ymonótonosi todalínea horizontal intersecta con P comomáximo en dos puntos,es decir, está formado pordos cadenas ymonótonas

Encontrar particiones monótonas

1. Realizaruna partición en trapecios

126

Page 127: Libro de Geometria Computacional

Geometría Computacional

2. 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

3. Cada trapecio tiene dos vértices, uno superior y otro inferior. 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.Encontrartrapecios:

Ordenar vértices ---- O(n logn)Cada vértice ---- O(logn)

2.Localizarlas cúspidesCada vértice ---- O(1)

3.EliminarcúspidesCada cúspide --- O(1)O(nlogn)O(n)

Triangulación de particionesMonótonas

127

Page 128: Libro de Geometria Computacional

Geometría Computacional

Un polígono monótono tienela ventaja de enfrentar losvértices izquierdos conlos derechos paraformar 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.2 Particionamiento en Trapezoides

Trapezoide:

Es un cuadrilátero con dos de sus aristas paralelas. En una trapezoidalización horizontal

Trapezoide tiene dos vértices de apoyo.

1) en su arista superior.

2) en su arista inferior.

128

Page 129: Libro de Geometria Computacional

Geometría Computacional

Trapezoidalizacion:

Una trapezoidalización horizontal del polígono es sostenida por el arrastre, 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’.

129

Page 130: Libro de Geometria Computacional

Geometría Computacional

Realizar el barrido del plano para construir los trapezoides.

Particionar el polígono en piezas monótonas mediante la conexión de cúspides interiores:

- Conectar cada cúspide ascendente al vértice de apoyo de arriba.

- Conectar cada cúspide descendente al vértice de apoyo debajo de su trapezoide.

- Triangular cada polígono monótono obtenido.

Fin

IV.3 Particionamiento Convexo

Una partición convexa es aquella en la que las piezas obtenidas son todas convexas, es decir, que sus ángulos internos son todos menores o igual a 180º.

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, lo habrá en la partición en polígonos convexos.

Teorema:

130

Page 131: Libro de Geometria Computacional

Geometría Computacional

Sea Ø (fi) el número mas pequeño de piezas convexas en le cual el polígono puede ser particionado, para un polígono de ‘R’ vértices cóncavos.

Algoritmo de Hertel y Melhorln

Inicio

Comenzar con una triangulación arbitraria de P.

Remover una diagonal esencial.

Repetir el paso 2.

Fin.

Diagonal esencial llamamos una diagonal ‘d’ esencial para un vértice

‘v’ si la remover ‘d’ crea una pieza que no es convexa ende.

Si ‘d’ es esencial esta debe incidir en ‘v’ y ‘v’ debe ser cóncava.

Ejemplo:

131

[r/2] + ┴ ≤ Ø ≤ r+1 r=6 Ø: # de piezas ótimas.

[6/2] +1≤ Ø ≤6+1 r: cantidad de vértices côncavos.

4≤Ø≤7

Page 132: Libro de Geometria Computacional

Geometría Computacional

v d td Rez

0 0-21 e no 4 4-8 e no 13 13-13 e no

1 1-21 e no 4-6 e no 13-15 i no

1-20 i E 6 6-4 e no 16 15-1 e no

1-15 e no 6-8 i E 15-20 i E

1-3 i E 8 8-4 e no 15-19 e no

9 9-3 e no 16 16-19 i E

3 3-15 i E 9-13 i E 16-18 e no

3-13 e no 10 10-13 i E 21 21-1 e no

3-9 e no 10-12 e no 21-0 e no

3-8 i E 12 12-10 e no

132

Page 133: Libro de Geometria Computacional

Geometría Computacional

UNIDAD V: CIERRE CONVEXO

V.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, y por extensión en los problemas relacionados con matemáticas que son prácticamente todos.

  La convexidad se estudia bajo dos puntos de vista, por un lado el concepto de convexidad aplicado a conjuntos; para más tarde analizar lo que se entiende por convexidad y concavidad para funciones.

     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, y pertenecientes al conjunto se cumple que el segmento xy que forman está contenido en dicho conjunto S.

     Este concepto queda expresado en un lenguaje matemático de la siguiente forma:

133

Page 134: Libro de Geometria Computacional

Geometría Computacional

Para comprender mejor la definición de conjunto convexo debe tenerse en cuenta

que dados dos puntos x e y, los puntos de la forma corresponden justamente con los puntos del segmento que une x e y.

     Como generalización del concepto de segmento entre dos puntos, 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, también llamado envolvente convexa, es uno de los principales problemas a la hora de trabajar en problemas de Geometría Computacional, ya que es necesario utilizarlo y aplicarlo para muchos de los problemas que se tratan en esta área.

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.

El uso de la envolvente convexa en diversos tipos de aplicaciones es muy común, como por ejemplo, en el procesado de imágenes o en localización.

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.

134

. . .

. .

. . .

Page 135: Libro de Geometria Computacional

Geometría Computacional

Una definición más formal es la que se expone a continuación:

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

- CC(S) es convexo.

- S está contenido en CC(S).

- CC(C) es el menor convexo que contiene a S.

Los puntos de la frontera de la envolvente convexa se llaman vértices o extremos del cierre convexo.

La envolvente convexa de una nube de puntos es siempre un polígono convexo.

Algoritmos

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

Es posible calcular la envolvente convexa de un convexo S en tiempo 0(n log n) y ese tiempo es óptimo.

Se puede calcular la envolvente convexa de una nube de puntos a partir de su diagrama de VORONOI en tiempo lineal, seria en tiempo óptimo, pero no es una

vía practica si no tenemos calculado de antemano el diagrama de Voronoi.

Puntos de Frontera:

Los puntos de la frontera de la envolvente convexa se llaman vértices o extremos de la envolvente convexa, pero también se les suele denominar, de forma poco afortunada, con el mismo nombre de envolvente convexa.

Puntos Extremos:

135

Page 136: Libro de Geometria Computacional

Geometría Computacional

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.

Puntos por definición:

1. Punto más alto.

2. Punto más bajo.

3. Punto más a la izquierda.

4. Punto más a la derecha.

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.

No-Extremos

136

Page 137: Libro de Geometria Computacional

Geometría Computacional

V.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

Si (P[l] está a la izquierda || sobre (p[i], p[j]) && P[l] está a la izquierda || sobre (p[k], p[j])) entonces

Retornar verdadero

Fin.

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], P[j]) entonces

(Pi, Pj) es no- extrema

Fin.

V.3 Gift Wrapping

137

Page 138: Libro de Geometria Computacional

Geometría Computacional

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

Paso 2: Se puede encontrar un punto B, 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. Repetimos este proceso para el resto de puntos y obtendremos la envolvente convexa.

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

Algoritmo de Gift Wrapping.

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],p[i+1]

i++

Mientras p[i]!= p[0]

Retornar p

Fin.

V.4 Quick Hull

138

Page 139: Libro de Geometria Computacional

Geometría Computacional

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

Paso1: Encontrar os cuatro puntos extremos de la nube de puntos (norte, sur, este y oeste) y formar un cuadrilátero con estos puntos como esquinas, todos los puntos que hayan quedado dentro de este cuadrilátero no formaran ya parte de la frontera.

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

En cada una de estas regiones obtendremos el punto mas alejado al lado del cuadrilátero adyacente a esa zona.

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

Esta figura resultante será el cierre convexo.

El algoritmo Quick Hull calcula la envolvente convexa en tiempo 0(n2).. A pesar de ser de orden cuadrático, suele tardar menos tiempo que calculando mediante diagrama de Voronoi.

Algoritmo Quick-Hull.

Características

Es recursivo

Cada recursión separa los datos en varios grupos

139

Page 140: Libro de Geometria Computacional

Geometría Computacional

Es la manera más rápida de calcular el cierre convexo

Algoritmo Quick-Hull.

1. Dado un conjunto de puntos y un segmento AB que sabemos que está en el cierre convexo.

(Una buena cuerda para empezar es unir el vértice más a la izquierda con el vértice más a la derecha.)

2. Entre los puntos dados, encontrar el más distante de AB. Llámese este C.

3. Los puntos dentro del triángulo ABC no pueden estar en el cierre. Ponerlos en el conjunto s0.

4. Poner los puntos que yacen fuera de AC en el conjunto S1 y los puntos que yacen fuera de BC en s2.

Una vez hecha la partición, recursivamente se invoca la función sobre los conjuntos s1 y s2.

UNIDAD VI: DIAGRAMA DE VORONOI

VI.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.

Sea P= {P1, P2…Pn}

140

Page 141: Libro de Geometria Computacional

Geometría Computacional

Un conjunto de puntos en el plano Euclidiano bidimensional estos son llamados los sitios, 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|, j≠i}

CONSTRUCCIÓN DEL DIAGRAMA

Para una cantidad pequeña de sitios:

n=2

TODOS TIENEN GRADO 3

141

Page 142: Libro de Geometria Computacional

Geometría Computacional

n=3 sitios

n=4 sitios

142

Page 143: Libro de Geometria Computacional

Geometría Computacional

Propiedades

1. Cada región de Voronoi v(Pi) es convexa.

2. v (Pi) es ilimitada si y solo si su sitio es correspondiente pertenece al cierre convexo del conjunto de puntos dados.

3. Si v es un vértice de Voronoi en la unión deP1, P2, P3,… entonces ‘v’ es el centro del circulo.

4. c (v) es el cirscunscirculo del triangulo Delaunay correspondiente a v.

5. El interior de c (v) no contiene sitios.

6. Si Pj es el vecino mas cercano a Pi entonces

143

Page 144: Libro de Geometria Computacional

Geometría Computacional

Pi y Pj (Pi, Pj) es una arista de Delaunay.

7. Si hay algún círculo a través de Pi y Pj (Pi, Pj) el cual no contiene otros sitios

Entonces (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.

Propiedades # 1

Todo punto perteneciente

a una arista de Voronoi del

conjunto de puntos S es

equidistante a los puntos

144

Page 145: Libro de Geometria Computacional

Geometría Computacional

más cercanos de S

Propiedades # 2

Los vértices de Voronoi

son los centros de

círculos circunscritos

por tres puntos de S.

Dado un vértice v,

llamamos a ese círculo

C(v),

Propiedades # 3

Para cualquier vértice v

del diagrama de Voronoi,

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

145

Page 146: Libro de Geometria Computacional

Geometría Computacional

V.2 Triangulación de Delaunay.

Es una traslación del plano dual al

diagrama de Voronoi.

Se puede construir la triangulación de Delaunay a partir del diagrama de Voronoi.

Basta con unir todos aquellos

generadores que compartan un eje de Voronoi.

Si el diagrama de Voronoi es degenerado, el paso anterior no

devuelve una triangulación, sino una pretriangulación de

Delaunay, aunque es un polígono inmediato de triangular.

Propiedades

1. Una arista de Delaunay es la recta dual de una arista de Voronoi.

2. Una triangulación, 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.

146

Page 147: Libro de Geometria Computacional

Geometría Computacional

3. A cada cara de Delaunay la responde un vértice de Voronoi.

4. A cada arista de Delaunay la corresponde una arista de Voronoi.

5. A cada nodo de Delaunay la corresponde una región de Voronoi.

6. La frontera de Delaunay es el cierre convexo de los sitios.

7. El interior de cada cara de Delaunay no contiene ciclos.

VI.3 Algoritmos Y Aplicaciones

¿Cómo calcular el diagrama de Voronoi de S?

147

Page 148: Libro de Geometria Computacional

Geometría Computacional

Paradigma de divide y vencerás

1. Dividir S en dos subconjuntos S1 y S2 de aproximadamente el mismo tamaño.

2. Calcular recursivamente Vor(S1) y Vor(S2).

3. Unir la información obtenida en 2 para obtener Vor(S).

Ordenamos los puntos según la coordenada x.

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

Recursivamente, encontramos el convex hull de L y R. para mezclar el cierre de L y el de R es necesario unirlos utilizando las tangentes comunes más altas y bajas. La tangente superior común 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. Para la tangente inferior giraremos en los sentidos inversos.

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

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

148

Page 149: Libro de Geometria Computacional

Geometría Computacional

UNIDAD VII: BUSQUEDA E INTERSECCION

VII.1 Punto que esta en el interior de un polígono

CASO DE UN POLIGONO CASO DE UN POLIGONO

CONVEXO CONCAVO

149

Page 150: Libro de Geometria Computacional

Geometría Computacional

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.

El punto “q” esta dentro o fuera del polígono, si el numero de cruces es impar o par respectivamente, 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.

150

Numero de cruces:

(5,6); (6,7); (8,9); (10,11); (15,16).

Page 151: Libro de Geometria Computacional

Geometría Computacional

Ejemplo:

# define x 0

# define y 1

bool inpoly (int [ ], int P [ ] [ ], int n)

{

int i, int i1, d, cruse=0;

double x;

for (i = 0; i < n; i++)

for (d = 0; d < DIM; d++)

{

P[i][d] = P[i][d]-q[d];

i1 = (i + n-1) % n;

if(((P[i][y] >0 && (P[i1][0y] <= )) ((P[i][y] >0 && (P[i1][0y] <=0)))

{

x= P[i][x]*P[i1][y]- P[i1][x]*P[i][x]*P[i][y] (double)(P[i1][y]-P[i][y]);

if (x>0)

cruce++;

151

Page 152: Libro de Geometria Computacional

Geometría Computacional

}

}

if ((cruce % 2) == 1)

return (TRUE);

else

return (FALSE);

}

VII.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.

     Este proceso se puede ver de manera sencilla, cuando tenemos 4 puntos en una posición convexa, estos cuatro puntos tienen dos posibles triangulaciones (obsérvese la figura).

152

Page 153: Libro de Geometria Computacional

Geometría Computacional

     La triangulación en la cual los círculos circunscritos son vacíos, es decir, no contienen en su interior al cuarto punto, 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, en polígonos lo único que debemos saber es el mecanismo general, que es el intercambio de una arista por la otra).

     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, pero como se comento eso es principalmente en nubes de puntos, en polígonos no nos fijaremos en los ángulos).

     Las aristas que se flipan se las denomina como ilegales, por tanto en nuestro caso, todas nuestras diagonales del polígono serán ilegales, puesto que son potencialmente flipables.

     Hay que hacer notar que el flipado de aristas o de diagonales produce un cambio local en todo el conjunto global de puntos, si estamos en una nube, o del polígono convexo si es aquí donde estamos trabajando. Y esto nos da idea de la ventaja que nos da este proceso, ya que podemos ir variando localmente una triangulación sin afectar al resto, y del mismo modo deshacer los pasos dados sin mayor problema.

ALGORITMO

     Algoritmo para intercambiar segmentos:

1. Eliminar el segmento que vamos a flipar.2. Obtener los puntos asociados de ambos extremos del segmento.

3. Obtener los puntos comunes entre los asociados de los extremos del segmento.

4. Si tan solo tenemos dos puntos comunes entre los asociados, entonces añadir un segmento cuyos extremos son dichos puntos.

5. Si hay mas de dos puntos comunes, comprobar de entre ellos con cuales es posible trazar un segmento y añadirlo.

6. Terminar.

153

Page 154: Libro de Geometria Computacional

Geometría Computacional

     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, se iluminan de color verde todos los segmentos que son potencialmente flipables, en nuestro problema son todas las aristas internas del polígono, así pues como se ve en la viñeta se iluminan las diagonales.

     2: El siguiente paso es seleccionar la diagonal que queremos flipar, para ello tan solo hay que situar el cursor encima de ella (si estamos en el caso de que estemos intercambiando manualmente), y aparecerá como se muestra en la secuencia una mano, pulsaremos y se procederá a realizarse el flipado de dicha arista interna.

     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, y se puede volver a flipar si se desea, ya que los segmentos potencialmente flipables se mantienen iluminados.

154

Page 155: Libro de Geometria Computacional

Geometría Computacional

155

Page 156: Libro de Geometria Computacional

Geometría Computacional

156

Page 157: Libro de Geometria Computacional

Geometría Computacional

157

Page 158: Libro de Geometria Computacional

Geometría Computacional

158

Page 159: Libro de Geometria Computacional

Geometría Computacional

159

Page 160: Libro de Geometria Computacional

Geometría Computacional

160

V5V0V1V2V3e4e5e0e1e2V4e3V5V0V1V2V3