geometría computacional libro1

of 49 /49
UNIVERSIDAD CENTRAL DEL ECUADOR Facultad de Ingeniería Ciencias Físicas y Matemáticas Geometría Computacional Integrantes: María José Cordero Oscar Viana Miriam Sánchez 2009-2010

Author: geometriacomputacional

Post on 20-Jun-2015

1.616 views

Category:

Documents


4 download

Embed Size (px)

DESCRIPTION

Tópicos de Geometría Computacional

TRANSCRIPT

UNIVERSIDAD CENTRAL DEL ECUADORFacultad de Ingeniera Ciencias Fsicas y Matemticas

Geometra Computacional

Integrantes:

Mara Jos Cordero Oscar Viana Miriam Snchez

2009-2010

INDICE DE CONTENIDO 1 Introduccin a la Geometra Computacional 1.1 Qu es la Geometra Computacional? 1.2 Algunas Aplicaciones de la Geometra Computacional 1.3 Terminologa 1.3.1.1 Recta 1.3.1.2 Rayo 1.3.1.3 Segmento 1.4 Familias Notables de Polgonos 1.4.1.1 Cadena Poligonal 1.4.1.2 Poligonal simple 1.4.1.3 Poligonal Cerrada 1.4.1.4 Curva de Jordn 1.4.1.5 Polgono Convexo 1.4.1.6 Polgono Estrellado 1.4.1.7 Ncleo de un Polgono 1.4.1.8 Polgono Dbilmente Visible de un lado 1.4.1.9 Polgono Dbilmente Visible desde el exterior 1.4.1.10 Polgono Montono 1.5 rea Signada de un Tringulo 1.5.1.1 Aplicaciones del rea Signada 1.6 rea de un Polgono Triangulacin de Polgonos 2.1 Conjetura de Kleen 2.2 Tree Coloring 2.3 Diagonales y Triangulacin 2.4 Triangulacin Dual 2.5 Interseccin entre Segmentos

2

Universidad Central del Ecuador

2

Geometra Computacional

3 Conjuntos Convexos 3.1 Cierre Convexo CH(S) 3.2 Soporte de S 3.3 Caracterizaciones para determinar la Envolvente Convexa 3.4 Marcha de Jarvis 3.4.1 Descripcin Geomtrica 3.4.2 Estudio de Complejidad 3.5 Scan Graham 3.5.1 Algoritmo de Graham 3.5.2 Anlisis de Complejidad

1.1 Geometra ComputacionalLa Geometra Computacional es una disciplina que se ocupa del diseo y anlisis de algoritmos que resuelven problemas geomtricos. La complejidad de un algoritmo no es sino una medida del coste que supone su ejecucin tanto en tiempo (o nmero de operaciones elementales que ha de realizar) como en espacio (o unidades de memoria requeridas para almacenar y manipular los datos a lo largo de la ejecucin) y vendr dada en funcin del nmero de datos de entrada. El estudio de la complejidad de un algoritmo puede llevarse a cabo principalmente bajo dos puntos de vista: Complejidad en el peor de los casos. Complejidad en media (o esperada). La primera consiste en medir la complejidad del algoritmo atendiendo a su ejecucin cuando trata los datos del problema en el caso ms desfavorable, entendindose por desfavorable el ms costoso. La segunda consiste en medir la complejidad haciendo un promedio entre todos los casos (favorables y no favorables) atendiendo a la probabilidad de que aparezcan como entrada. Para ello se supone que los datos de entrada vienen dados conforme a cierta distribucin de probabilidad y se estudia cual es el tiempo esperado de ejecucin. 1.2 Aplicaciones de la Geometra Computacional La primera generacin va a ser la de los clculos numricos, aplicados sobre todo a problemas cientficos y tcnicos. La segunda necesidad comercial y administrativa, incorporaba largas listas de datos (por ejemplo alfabticos), con vistas a como leer, almacenar, modificar, seleccionar, e imprimir esos datos. Todo esto naturalmente pervive, y con fuerza, pero vivimos una tercera generacin de aplicaciones dominada por el procesamiento de informacin geomtrica y grfica, presente en reas tan diversas como son la medicina, la cartografa, el control de robots o el diseo artstico. La Geometra Computacional ha emergido, ciertamente, por la necesidad de dar respuesta a esta nueva y creciente demanda. Dentro de los campos de aplicacin ms directamente relacionados con la disciplina destacaremos la Informtica Grfica, el Diseo y Fabricacin Asistida por Ordenador (CAD/ CAM), la Caracterizacin y Reconocimiento Automtico de Formas (Pattern Recognition), el Diseo VLSI, la visin Artificial, la Cartografa y la Robtica. 1.3 Terminologa El elemento geomtrico ms sencillo es el punto, que en el plano vendr dado por un par ordenado de nmeros reales, generalmente sus coordenadas cartesianas. 1.3.1 La recta que pasa por dos puntos, p; q, es el lugar geomtrico de los puntos.

Universidad Central del Ecuador

3

Geometra Computacional

1.3.2 El rayo que emana de p y pasa por q es la semirrecta de puntos

1.3.3 El segmento de extremos p y q es el conjunto

Cdigo en Matlab%funcin que dibuja un segmento entre 2 puntos function seg = segmento2(A,B) t = 0:0.01:1; AB = B-A; X1 = A(1)+t*AB(1); Y1 = A(2)+t*AB(2); hold on plot(X1,Y1,'.'); end

1.4 Familias notables de polgonos En la prctica se ha comprobado que determinados algoritmos que se ejecutan sobre polgonos tienen un mejor rendimiento, en cuanto a velocidad, si el polgono de entrada tiene ciertas buenas propiedades. Otras veces, los problemas reales involucran polgonos con caractersticas especiales y resulta ms fcil encontrar algoritmos que resuelvan esos problemas para dichos polgonos que para polgonos generales. 1.4.1 Cadena Poligonal Un conjunto ordenado de n puntos distintos en el plano determina una (cadena) poligonal que es la unin de los segmentos . A estos segmentos se les llama lados y a sus extremos vrtices de la poligonal. Lados adyacentes en una poligonal son aqullos que son consecutivos en la lista ordenada de segmentos anterior. 1.4.2 Una poligonal simple es aqulla en la que dos lados, si se cortan, lo hacen exactamente en uno de sus extremos y adems son adyacentes. 1.4.3 Una poligonal cerrada determinada por segmentos . es la unin de

Universidad Central del Ecuador

4

Geometra Computacional

1.4.4 Una poligonal cerrada simple determina una Curva de Jordan que divide al plano en tres regiones: 1.- Interior a la curva 2.- Exterior a la curva 3.- La propia curva Al conjunto de puntos de la regin interior junto con los puntos de la poligonal cerrada. El interior del polgono P, , es el conjunto de puntos de la regin interior. La frontera del polgono, o P, es el conjunto de puntos de la poligonal cerrada simple. Y el exterior del polgono, , es el conjunto de puntos de la regin exterior.

Cdigo 1 de la poligonal en Matlab%funcin que dibuja una poligonal que recibe un Punto representado por un vector function pol = Poligonal(m) n = input('ingrese nmero de puntos: '); for i = 1: n v = input('ingrese P(x,y): '); for j = 1: 2 m (i,j) = v(j) end end for k = 2: n for j = 1: 2 p(j) = m(k-1,j); q(j) = m(k,j) ; r(j) = m(n,j); s(j) = m(1,j); end segmento(p,q) segmento(r,s) end end

Universidad Central del Ecuador

5

Geometra Computacional

Cdigo 2 de la poligonal en Matlab%funcin que dibuja una Poligonal cerrada. function cadena = cadenaPol(a,nr) %se ingresa una matriz (nrow,2) for i = 2: nr for j = 1: 2 d(j) = a(i-1,j); e(j) = a(i,j) ; f(j) = a(nr,j); g(j) = a(1,j); if j == 2 % se llama a la funcin segmento que lo grafica segmento2(d,e) segmento2(f,g) text(d(1),d(2),'P') text(e(1),e(2),'P') end end end end

Cdigo en C# //dibujamos las lneas del polgono con el mouseprivate void panel_screen_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point p = new Point(e.X, e.Y); puntos.Add(p); status = prosess_status.DIBUJANDO; } else if (e.Button == MouseButtons.Right) { if (puntos.Count < 3) { MessageBox.Show("Debe seleccionar al menos 3 puntos"); return; } polygon = new Point[puntos.Count]; for (int i = 0; i < puntos.Count; i++) polygon[i] = (Point)puntos[i]; Graphics g = panel_screen.CreateGraphics(); g.Clear(Color.White); dibujarPoligono(); status = prosess_status.POLIGONOLISTO; btnTriangular.Enabled = true; } } //en este metodo dibujaremos private void panel_screen_MouseMove(object sender, MouseEventArgs e) { if (status == prosess_status.DIBUJANDO) { Point inicio, fin; Graphics g = panel_screen.CreateGraphics();

Universidad Central del Ecuador

6

Geometra Computacional

g.Clear(Color.White); inicio = (Point)puntos[0]; g.DrawLine(new Pen(Color.Yellow, 2), inicio.X - 6, inicio.Y, inicio.X + 6, inicio.Y); g.DrawLine(new Pen(Color.Yellow, 2), inicio.X, inicio.Y - 6, inicio.X, inicio.Y + 6); for (int i = 0; i < puntos.Count - 1; i++) { inicio = (Point)puntos[i]; g.DrawLine(new Pen(Color.Yellow, 2), inicio.X - 6, inicio.Y, inicio.X + 6, inicio.Y); g.DrawLine(new Pen(Color.Yellow, 2), inicio.X, inicio.Y - 6, inicio.X, inicio.Y + 6); fin = (Point)puntos[i + 1]; g.DrawLine(new Pen(Color.Yellow, 2), fin.X - 6, fin.Y, fin.X + 6, fin.Y); g.DrawLine(new Pen(Color.Yellow, 2), fin.X, fin.Y - 6, fin.X, fin.Y + 6); g.DrawLine(new Pen(Color.Blue, 2), inicio, fin); } inicio = (Point)puntos[puntos.Count - 1]; fin = new Point(e.X, e.Y); g.DrawLine(new Pen(Color.Blue, 2), inicio, fin); g.DrawLine(new Pen(Color.Yellow, 2), fin.X - 6, fin.Y, fin.X + 6, fin.Y); g.DrawLine(new Pen(Color.Yellow, 2), fin.X, fin.Y - 6, fin.X, fin.Y + 6); } lbCoordenadas.Text = "X:" + e.X + " , Y:" + e.Y; } private void area() { int n = puntos.Count; float area = 0; for (int i = 1; i < n - 1; i++) area = area + (((Point)puntos[i]).Y - ((Point)puntos[i + 1]).Y) * (((Point)puntos[i]).Y - ((Point)puntos[i + 1]).Y); area = Math.Abs(area); MessageBox.Show("El area es:" + area); } private void btnTriangular_Click(object sender, EventArgs e) { area(); }

public void dibujarPoligono()

Universidad Central del Ecuador

7

Geometra Computacional

private void btnLimpiar_Click(object sender, EventArgs e) { puntos.Clear(); polygon = null; Graphics g = panel_screen.CreateGraphics(); g.Clear(Color.White); btnTriangular.Enabled = false; status = prosess_status.ESPERANDO; }

{ if (polygon != null) { Graphics g = panel_screen.CreateGraphics(); for (int i = 0; i < polygon.Length; i++) { g.DrawLine(new Pen(Color.Yellow, 2), polygon[i].X - 8, polygon[i].Y, polygon[i].X + 8, polygon[i].Y); g.DrawLine(new Pen(Color.Yellow, 2), polygon[i].X, polygon[i].Y - 8, polygon[i].X, polygon[i].Y + 8); } g.DrawPolygon(polygon_pen, polygon); } } private void panel_screen_Paint(object sender, PaintEventArgs e) { switch (status) { case prosess_status.ESPERANDO: break; case prosess_status.POLIGONOLISTO: dibujarPoligono(); break; default: break; } }

Un polgono queda perfectamente determinado por el conjunto de sus vrtices ordenados segn aparecen al recorrer su frontera, y una orientacin que nos permita conocer dnde queda su interior al recorrer su frontera. As, si recorremos la frontera en sentido horario dejaremos el interior a nuestra derecha, en cambio si la recorremos en sentido anti horario lo dejaremos a la izquierda. Caben pues dos orientaciones posibles para recorrer la frontera: la negativa (horaria) y la positiva (anti horaria). Salvo que se indique lo contrario, supondremos siempre que un polgono viene dado por una lista cclica con sus vrtices ordenados con orientacin positiva. Y la notaremos Simplemente , entendiendo que el siguiente a es . La estructura de datos ms adecuada para representarla es la lista circular doblemente enlazada.

1.4.5 Un polgono P es convexo si para todo

el segmento

.

Polgono convexo

Polgono no convexo: x e y no se ven

Esta propiedad de contener al segmento que une dos puntos admite una interpretacin curiosa en trminos de visibilidad: se ven interiormente si

Universidad Central del Ecuador

8

Geometra Computacional

, o lo que es lo mismo exteriormente si .

. Anlogamente se dice que se ven

1.4.6 Un polgono P es estrellado si existe un punto tal que para todo el segmento . Es decir, existe un punto en P que ve interiormente a todo el polgono.

Polgonos estrellados 1.4.7 El ncleo de un polgono P ven interiormente a P. Teorema P es convexo si, y slo si, P es estrellado si, y slo si,

Polgonos no estrellados , es el conjunto de puntos de P que

,y .

Si uno de los vrtices del polgono est en el ncleo, entonces se dice que es un abanico.

Estrellados y sus respectivos ncleos 1.4.8 Dbilmente Visible desde un Lado (DVL) Un polgono dbilmente visible desde un lado es aquel en el que hay un lado l del polgono tal que para cada punto y del polgono existe un punto que ve anteriormente a y.

Todo punto de P se ve desde algn punto de l, en particular desde x, x, x En trminos de iluminacin se interpreta de la siguiente manera. Para iluminar el interior de un polgono estrellado basta colocar una bombilla en un punto de su ncleo, y para un dbilmente visible desde un lado, bastara con colocar una barra fluorescente a lo largo del lado l.

Universidad Central del Ecuador

9

Geometra Computacional

1.4.9 Dbilmente Visible desde el Exterior (DVE) Un polgono P dbilmente visible desde el exterior, se abreviar DVE, es aqul en el que para todo existe un rayo r que emana de x tal que r . La interpretacin en trminos de visibilidad o vigilancia es la siguiente. Supongamos que el polgono representa una fortaleza y un guardia patrulla a lo largo del muro exterior (la frontera). Ser DVE significa que en cada posicin de su recorrido siempre hay una direccin en la que se ve el horizonte.

Polgono DVE Polgono no DVE: no se ve el horizonte en ninguna direccin En trminos de iluminacin, consideremos una circunferencia suficientemente grande para que contenga totalmente al polgono. Para iluminar el muro exterior de la fortaleza (o edificio de inters turstico) basta con colocar un fluorescente circular sobre la circunferencia anterior. 1.4.10 Polgono Montono Un polgono P se dice que es montono respecto de una direccin D si toda recta r ortogonal a la recta D verifica que

P montono respecto a D

P no montono con respecto a D

Universidad Central del Ecuador

1 0

Geometra Computacional

Se dice que P es montono, si lo es respecto de alguna direccin. Tambin puede darse una definicin alternativa atendiendo slo a la frontera de P: un polgono es montono cuando su frontera se puede descomponer en dos cadenas montonas respecto a la misma direccin. Entendiendo por cadena poligonal montona respecto a D si cualquier recta ortogonal a D que interseca a la cadena lo hace en un punto o en un lado.

Cadena montona respecto a D 1.5 rea signada de un tringulo

Cadena no montona respecto a D

Consideremos tres puntos en el plano El rea del triangulo que determinan viene dado por

.

Ahora bien, del producto vectorial de y Recordando que, si la base canonca en el espacio entonces

, es decir, es el mdulo y son los vectores de

Y usando de nuevo las propiedades de los determinantes

Por Tanto

Universidad Central del Ecuador

1 1

Geometra Computacional

Y el rea del tringulo: Sin embargo, nos vamos a fijar en el determinante Su signo es el

del vector y por tanto se rige por la conocida regla del sacacorchos. Aqu nos va a servir para determinar la orientacin del tringulo . Regla de la mano derecha

, significa que , significa que

describe la frontera con orientacin positiva. describe la frontera con orientacin negativo.

1.5.1 Aplicaciones del rea signada Localizacin de un punto respecto de una recta Si consideramos la recta que pasa por los puntos y y queremos saber dnde se encuentra un tercer punto q basta calcular el rea signada . Si es positiva, q est en el semiplano izquierdo determinado por la recta orientada segn . Si es negativa, est en el derecho, y si es cero est en la recta.

Ejemplo

Si Si Si

El punto que est a la izquierda de la recta El punto que est a la derecha de la recta El punto que est en la recta

Universidad Central del Ecuador

1 2

Geometra Computacional

Ejercicio

Universidad Central del Ecuador

1 3

Geometra Computacional

Entonces

Cdigo 1 en Matlab%indica la posicin de un punto de acuerdo a una recta function mensaje = apArSig() a = input('ingrese p1 '); b = input('ingrese p2 '); c = input('ingrese punto a verificar: '); f1 = [1;a]; f2 = [1;b]; f3 = [1;c]; segmento(a', b'); segmento2(c', c'); M = [f1,f2,f3]; longAC = sqrt((a(1)-c(1))^2 + (a(2)-c(2))^2); longBC = sqrt((b(1)-c(1))^2 + (b(2)-c(2))^2); apSig = det(M); if(apSig > 0) mensaje=('El punto est a la izquierda'); else if(apSig < 0) mensaje=('El punto esta a la derecha'); else if(apSig == 0) if (a(1)< c(1) && c(1)< b(1)) mensaje=('El punto est en la recta'); end if longAC < longBC mensaje=('El punto esta atrs'); end if longBC < longAC mensaje=('El punto est delante'); end end end end end

Cdigo 2 en Matlab%Funcin que indica la posicin de un punto de acuerdo a la una recta function areaSig = AreaSig(p1,p2,q) f1 = [1;p1]; f2 = [1;p2]; f3 = [1;q]; segmento2(q', q'); A = [f1,f2,f3];

Universidad Central del Ecuador

1 4

Geometra Computacional

areaSig = det(A); dac = sqrt((p1(1)-q(1))^2 + (p1(2)-q(2))^2); dbc = sqrt((p2(1)-q(1))^2 + (p2(2)-q(2))^2); if(areaSig > 0) text(q(1)+ 0.2,q(2),'izquierda') else if(areaSig < 0) text(q(1)+ 0.2,q(2),'derecha') else if(areaSig == 0) if (q(1)>p1(1) && q(1) 0) txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta a la izquierda de la recta"; else if (determinante < 0) txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta a la derecha de la recta"; else { PointF vDirector = new PointF(l.puntoFinal.X l.puntoInicial.X, l.puntoFinal.Y - l.puntoInicial.Y); double t = (pun.X - l.puntoInicial.X) / vDirector.X; if (vDirector.X > 0 && vDirector.Y > 0) if (t < 0) txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta atras de la recta"; else if (t > 0 && t < 1) txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta en la recta"; else

Universidad Central del Ecuador

1 6

Geometra Computacional

txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta adelante de la recta"; else if (t < 0) txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta adelante de la recta"; else if (t > 0 && t < 1) txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta en la recta"; else //MessageBox.Show("El punto(" + pun.X + "," + pun.Y + ")esta atras de la recta"); txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y + ")esta atras de la recta"; } }

2. Triangularizacin de Polgonos

Entonces

2.1 Conjetura de KLEEN Sea = El nmero de guardias que recubre el polgono

Universidad Central del Ecuador

1 7

Geometra Computacional

= Conjunto de puntos (vrtices del polgono) I I = Cardinalidad de Sea un polgono de vrtices (1 es una cota inferior)

Ciertamente

Al menos debe haber un guardia

Adems , esto significa que puedo recubrir todo el polgono con guardias al poner cada guardia en cada vrtice.

8 9 11 3 12 2 6 5

1

Definicin.Una poligonal de un polgono es un segmento entre 2 vrtices claramente visibles el uno del otro. Esto significa que la interseccin del segmento cerrado exactamente el punto

e

que son

con la

es

Universidad Central del Ecuador

1 8

Geometra Computacional

La conjetura de Kleen dice que entera de .

, donde [ ] representa la funcin parte

de la cita.]

Llamamos diagonales concurrentes si su interseccin entre ellos es un subconjunto de sus puntos extremos. Si nosotros agregamos diagonales concurrentes e internas a un polgono tantas veces como sean posibles, el interior del polgono es particionado en tringulos. Una particin se llama triangularizacin del polgono . Observacin.- Las diagonales se agregan en orden aleatorio. 2.2 TREE COLORING Primer paso.Consiste en triangularizar el polgono con el concepto tree coloring. Sea el grafo asociado a la triangularizacin y cuyos nodos son los vrtices del polgono.

12 vrtices Necesito 3 guardias

Diagonales externas

Segundo paso.Definicin.El k-coloreo es la asignacin de k-colores diferentes en los nodos del grafo asociado al polgono P.

Un Grafo siempre puede ser coloreado con 3 colores. Tree Coloring. 1) Verde 2) Amarillo 3) Rojo

Universidad Central del Ecuador

1 9

Geometra Computacional

Observacin: El tree Coloring determina el nmero mximo de guardias pero no el nmero ptimo de guardias Tercer paso.Consiste en ubicar los guardias en el color que produce el nmero ptimo de guardias, los guardias son ubicados en los vrtices. Cuarto paso.Usar el principio del Palomar. Principio de PALOMAR.Si n objetos son puestos en k huecos es palomar, entonces al menos un hueco debe contener n objetos.

LEMA 1.2.1.- Cada polgono debe tener al menos un vrtice estrictamente convexo. Definicin.Se dice que un vrtice de un polgono es convexo cuando el ngulo interior que determina los lados concurrentes en l es menor o igual a .

Universidad Central del Ecuador

2 0

Geometra Computacional

2.3 Diagonales y Triangularizacin

Si los lados del polgono tienen orientacin positiva. Si un caminante recorre la frontera en algn momento debe virar a la izquierda y el interior del polgono est siempre a su izquierda. Sea una recta que pasa por un vrtice (el ms bajo) (el que tiene la menor ordenada), y el ms a la derecha, como es orientacin positiva el siguiente vrtice est encima de y elngulo es menor a y por tanto se obtiene el vrtice convexo. LEMA 1.2.2 (MEISTERS).- Cada polgono de memos) (un triangulo no tiene diagonales). Demostracin Sea un vrtice convexo, sean Si es diagonal, termina. los vrtices adyacentes a . vrtices tiene una diagonal (al

Si no es diagonal ( sea exterior o corte en la frontera) entonces construimos el tringulo. y consideramos un vrtice X que este en el tringulo para determinar el vrtice . Se traza paralelo el segmento que est en el tringulo y se puede terminar 2 diagonales y repito el proceso, si es diagonal y no es diagonal termina porque encontr que cada polgono tiene al menos una diagonal. LEMA1.2.3.- Cada polgono una o ms diagonales. Demostracin Usamos induccin matemtica. Si . El polgono es un triangulo y el teorema es trivial. Si Sea , una diagonal del polgono (El teorema de Meisters garantiza la existencia). Por definicin la diagonal corta en con y sta diagonal particiona el polgono en 2 poligonos cada uno de lso cuales tiene a . Como cada uno de los polgonos tiene el nmero de vrtices menos a , y luego aplica recursividad a cada polgono hasta obtener el nmero de vrtices de mi polgono. de vrtices puede ser particionado en tringulos por

Universidad Central del Ecuador

2 1

Geometra Computacional

Propiedades LEMA 1.2.4.diagonales y Demostracin Si Si Cada triangularizacin de un polgono tringulos. de vrtices tiene

Por hiptesis de Induccin Sea el polgono con vrtices y diagonales y tringulos. Creamos una particin del polgono con una diagonal y obtenemos

Aplicando el principio de induccin a los sub-polgonos para:

De n vrtices

Universidad Central del Ecuador

2 2

Geometra Computacional

(porque a y b estn en P1 y P2)

Para el nmero de tringulos

COROLARIO 1.2.5.La suma de los ngulos internos de un polgono de n-vrtices es Demostracin La suma de los ngulos interiores en un tringulo es tringulos entonces la suma de los ngulos del polgono es y como hay .

Cdigo en C# //este mtodo nos hace dibujar cada una de las lneas de la poligonal determinando en el punto que empieza y termina la recta para comenzar otrapublic partial class frmTriangular : Form { private ArrayList puntos = new ArrayList(); private Point[] polygon; private miFormaPoligonal m; private prosess_status status; private Pen polygon_pen = new Pen(Color.Black, 2); public frmTriangular() { InitializeComponent(); } private void panel_screen_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point p = new Point(e.X, e.Y); puntos.Add(p); status = prosess_status.DIBUJANDO; } else if (e.Button == MouseButtons.Right) { if (puntos.Count < 3) { MessageBox.Show("Debe seleccionar al menos 3 puntos"); return; } polygon = new Point[puntos.Count]; for (int i = 0; i < puntos.Count; i++) polygon[i] = (Point)puntos[i]; Graphics g = panel_screen.CreateGraphics(); g.Clear(Color.White); dibujarPoligono();

Universidad Central del Ecuador

2 3

Geometra Computacional

status = prosess_status.POLIGONOLISTO; btnTriangular.Enabled = true; } } //en este mtodo dibujaremos private void panel_screen_MouseMove(object sender, MouseEventArgs e) { if (status== prosess_status.DIBUJANDO) { Point inicio, fin; Graphics g = panel_screen.CreateGraphics(); g.Clear(Color.White); inicio = (Point)puntos[0]; g.DrawLine(new Pen(Color.Yellow, 2), inicio.X - 6, inicio.Y, inicio.X + 6, inicio.Y); g.DrawLine(new Pen(Color.Yellow, 2), inicio.X, inicio.Y - 6, inicio.X, inicio.Y + 6); for (int i = 0; i < puntos.Count - 1; i++) { inicio = (Point)puntos[i]; g.DrawLine(new Pen(Color.Yellow, 2), inicio.X - 6, inicio.Y, inicio.X + 6, inicio.Y); g.DrawLine(new Pen(Color.Yellow, 2), inicio.X, inicio.Y - 6, inicio.X, inicio.Y + 6); fin = (Point)puntos[i + 1]; g.DrawLine(new Pen(Color.Yellow, 2), fin.X - 6, fin.Y, fin.X + 6, fin.Y); g.DrawLine(new Pen(Color.Yellow, 2), fin.X, fin.Y - 6, fin.X, fin.Y + 6); g.DrawLine(new Pen(Color.Blue, 2), inicio, fin); } inicio = (Point)puntos[puntos.Count - 1]; fin = new Point(e.X, e.Y); g.DrawLine(new Pen(Color.Blue, 2), inicio, fin); g.DrawLine(new Pen(Color.Yellow, 2), fin.X - 6, fin.Y, fin.X + 6, fin.Y); g.DrawLine(new Pen(Color.Yellow, 2), fin.X, fin.Y - 6, fin.X, fin.Y + 6); } lbCoordenadas.Text = "X:" + e.X + " , Y:" + e.Y; } //dibuja las diagonales de la poligonal private void btnTriangular_Click(object sender, EventArgs e) { if (polygon == null | status!= prosess_status.POLIGONOLISTO) return; if (polygon.Length < 3) return; m = new miFormaPoligonal(polygon); m.triangular(); Graphics g = panel_screen.CreateGraphics(); g.Clear(Color.White);

Universidad Central del Ecuador

2 4

Geometra Computacional

draw_ears(false); dibujarPoligono(); status = prosess_status.TRIANGULACIONCOMPLETA; } private void btnLimpiar_Click(object sender, EventArgs e) { puntos.Clear(); polygon = null; m = null; Graphics g = panel_screen.CreateGraphics(); g.Clear(Color.White); btnTriangular.Enabled = false; status = prosess_status.ESPERANDO; } public void dibujarPoligono() { if (polygon!=null) // if we'r not animating { Graphics g = panel_screen.CreateGraphics(); for (int i = 0; i< polygon.Length ; i++) { g.DrawLine(new Pen(Color.Yellow, 2), polygon[i].X - 8, polygon[i].Y, polygon[i].X + 8, polygon[i].Y); g.DrawLine(new Pen(Color.Yellow, 2), polygon[i].X, polygon[i].Y - 8, polygon[i].X, polygon[i].Y + 8); } g.DrawPolygon(polygon_pen, polygon); // draw it } } private void draw_ears(Boolean wireframe_only) // draws tringulated polygons { if (m == null) // if m has been processed return; Graphics g = panel_screen.CreateGraphics(); for (int i = 0; i < m.poligonos.Length; i++) { g.DrawPolygon(new Pen(Color.Black, 1), m.poligonos[i]); // draw polygon Invalidate(); // update screen } g.DrawPolygon(polygon_pen, polygon); } private void panel_screen_Paint(object sender, PaintEventArgs e) { switch (status) { case prosess_status.ESPERANDO: break; case prosess_status.POLIGONOLISTO: dibujarPoligono(); break; case prosess_status.TRIANGULACIONCOMPLETA: draw_ears(false);

Universidad Central del Ecuador

2 5

Geometra Computacional

break; default: break; } }

2.4 Triangularizacin Dual Un importante concepto en la teora de los grafos es el grafo dual, utilizaremos este concepto para definir el dual de una triangularizacin. Definicin.El dual T* de una triangularizacin T de un polgono es un grafo con un nodo asociado a cada tringulo y un arco entre 2 nodos si y solo s su tringulos comparten una misma diagonal.

Universidad Central del Ecuador

2 6

Geometra Computacional

Observacin: En el grafo no se unen con porque no comparten una misma diagonal.

LEMA1.2.6.- El dual T* de una triangularizacin es un rbol. Es evidente que cada nodo tiene grado a lo ms 3, porque cada tringulo en nuestra triangularizacin puede compartir a lo ms 3 lados. Los nodos de grado (1) son hojas del rbol , los nodos de grado (2) son los caminos del rbol. y los nodos de grado (3) son puntos de ramificacin . Note que el dual es un rbol binario cuando cualquier nodo tiene grado 1 o 2 (hijos).

2.5 Interseccin de Segmentosc b

a d d da

Para que ad y cd se intersequen

a a

c

s,tb

d

Aplicamos la regla de Cramer

Universidad Central del Ecuador

2 7

Geometra Computacional

Si existe solucin s y t deben estar entre 0 y 1 y luego reemplazo. Cdigo 1 en Matlabfunction p = Interseccion() a = input('ingrese el punto b = input('ingrese el punto c = input('ingrese el punto d = input('ingrese el punto A: B: C: D: '); '); '); ');

detDen = (b(1)-a(1))*(d(2)-c(2)) - (d(1)-c(1))*(b(2)-a(2)); segmento(a,b); segmento(c,d); if ( detDen ~=0 ) s =((c(1)-a(1))*(d(2)-c(2))-(d(1)-c(1))*(c(2)-a(2)))/detDen; t =((c(1)-a(1))*(b(2)-a(2))-(b(1)-a(1))*(c(2)-a(2)))/detDen; if(((s>=0)&&(s=0)&&(t=0)&&(s=0)&&(t alfa2 ang = alfa2; sig = P; end end sig; O = [mat;sig]; BuscarSiguiente2(A,ps,sig,2,O,pc); end end end% rene las funciones anteriores para obtener la envolvente convexa.

function jarvis = Jarvis(m) po = MinOminA(m); ps = Siguiente(m,po); BuscarSiguiente2(m,po,ps,1,[po;ps],po); end Cdigo Jarvis en c#//Determina los puntos mximos, mnimos y los ngulos mximos de los segmentos private void jarvis() { int maxAngulo = 0, minAngulo = 0; maxPunto = 0; for (int k = 1; k < numeroPuntos; k++) { if (puntos[k].Y > puntos[maxPunto].Y) maxPunto = k; } minPunto = 0; for (int k = 1; k < numeroPuntos; k++) { if (puntos[k].Y < puntos[minPunto].Y) minPunto = k; }

Universidad Central del Ecuador

4 0

Geometra Computacional

puntosUsados.Add(minPunto); puntoActual = minPunto; while (puntoActual != maxPunto) { maxAngulo = puntoActual; for (int k = 0; k < numeroPuntos; k++) { g.DrawLine(p,puntos[puntoActual],puntos[k]); if (calcularAngulo(puntos[puntoActual].X, puntos[puntoActual].Y, puntos[minAngulo].X, puntos[minAngulo].Y) >= calcularAngulo(puntos[puntoActual].X, puntos[puntoActual].Y, puntos[k].X, puntos[k].Y) && (noUsado(k) || k == maxPunto) && calcularAngulo(puntos[puntoActual].X, puntos[puntoActual].Y, puntos[k].X, puntos[k].Y) >= 90) { minAngulo = k; } puntoActual = minAngulo; puntosUsados.Add(puntoActual); } } drawPermeter(); } private double calcularAngulo(double x1, double y1, double x2, double y2) { double deltaX = x2 - x1; double deltaY = y2 - y1; if (deltaX == 0 && deltaY == 0) return 0; double angle = Math.Atan(deltaY / deltaX) * (180.0 / Math.PI); if (deltaX >= 0 && deltaY >= 0) angle = 90 + angle; else if (deltaX >= 0 && deltaY < 0) angle = 90 + angle; else if (deltaX < 0 && deltaY > 0) angle = 270 + angle; else if (deltaX < 0 && deltaY 1), se

Universidad Central del Ecuador

4 3

Geometra Computacional

Nota:

le aplica un test de rea signada con sus vecinos para averiguar si las tres forman en un ngulo menor que . Luego por lo pronto tenemos n-1 clculos de reas signadas, sin embargo puede que sobre el mismo vrtice tengamos que aplicar de nuevo el mismo test porque sus vecinos han cambiado. Esto sucede cada vez que se borra un vrtice de la lista porque el test de rea signada aplicado sobre el sali negativo y aparecen ahora en la lista consecutivos vrtices que antes no lo eran. En definitiva se revisita de nuevo el vrtice para aplicarle de nuevo el test, si y solo si ha sido previamente borrado otro, y por tanto, globalmente el nmero de revisitaciones de vrtices esta acotado superiormente por el nmero de vrtices que se han borrado. Como mucho se pueden borrar n-3, luego el nmero mximo de test de reas signadas que se aplica a lo largo del algoritmo es 2n-4. Por tanto el coste total de las operaciones aritmticas es O(n). Las otras operaciones sobre estructuras de datos puede realizarse cada una en tiempo constante, por ejemplo si se utiliza una pila para representar C, adems cada vez que se trata un punto se realiza un nmero constante de operaciones. El nmero total de veces que se tratan vrtices es O(n), luego el coste total del Scan es O(n) y del algoritmo es O (nlogn). Implementacin del algoritmo de Matlab %funcin que devuelve 2 veces el rea de un tringulo function area2 = Area2(a,b,c) area2 = (b(1)-a(1))*(c(2)-a(2))- (c(1)-a(1))*(b(2)-a(2)); end %funcin que ordena aleatoriamente los puntos ingresados inicialmente, %recibe como parmetro la matriz de puntos A, el punto mnimos una k te de ayuda K, y mat que es la matriz que contiene al primer punto de la %envolvente convexa %Observacin: La funcin QuitarPunto est ubicada en Jarvis, min se obtiene con MinOminA function M = OrdenarAngularmente(A,min,k,mat) [n col] = size(A); if k ==1 A = QuitarPunto(A,min); end if n >= 2 ab(1) = min(1)+5; ab(2) = min(2); v3 = ab-min; P1(1) = min(1)-5; P1(2) = min(2); P2 = P1; v1 = P1-min; v2 = v1; alfa1 = acos((v3*v1')/(norm(v3)*norm(v1)))*(180/pi); alfa2 = acos((v3*v2')/(norm(v3)*norm(v2)))*(180/pi); if alfa1