Ind. Revista data de 8(), la Facultad 005 de Ingeniería Industrial Vol. (8) :. 69-76 (005) UNMSM ISSN: 560-946 (imreso) / ISSN: 80-9993 (electrónico) GEOMETRÍA COMPUTACIONAL: EL PROBLEMA DEL CERCO CONVEXO Receción: Noviembre de 005 / Acetación: Diciembre de 005 () Edgar Ruiz Lizama () Eduardo Raffo Lecca RESUMEN El artículo tiene or objetivo resentar los concetos fundamentales de la geometría comutacional mostrar una solución al roblema del cerco convexo, utilizando el algoritmo de Graham. Para la imlementación de la solución, los autores usan el lenguaje de rogramación Java. Palabras Clave: Geometría comutacional, diagramas de Voronoi, laneamiento de movimiento, roblema del cerco convexo, algoritmo de Graham. COMPUTATIONAL GEOMETRY: THE CONVEX HULL PROBLEM ABSTRACT The objective of this work is to show fundamental concets of comutational geometr and one solution for the convex hull roblem, using the Graham algorithm. The authors use the Java language rogramming in order to imlement the solution. Ke words: Comutational geometr, Voronoi diagrams, motion lanning, convex hull roblem, Graham algorithm. INTRODUCCIÓ N La geometría comutacional es una rama de la ciencia de la comutación emergió en la década de 970. Estudia los algoritmos que resuelven roblemas geométricos. Su alicación, va desde el diseño de los VLSI, hasta el CAD (Comuter-Aided Design), el CAM, comutación gráfica GIS (sistemas de información geográfica)[]. Imagine los teléfonos úblicos en una urbanización como contar con un maa que muestre las regiones en donde se encuentre el teléfono más cercano. Una distribución osible se resenta en la Figura. A la subdivisión de un área o localidad en regiones, se conoce como diagrama de Voronoi; ara hacer esto se hace uso de algoritmos geométricos. Sea un conjunto de obstáculos geométricos (como los mostrados en la Figura ), asuma que se desea encontrar la conexión más corta entre dos untos geométricos, salvando obstáculos. Este roblema que es crucial en robótica se conoce como laneamiento del movimiento (motion lanning), el cual hace uso de algoritmos geométricos. Un clásico roblema en CG (del ingles Comutational Geometr) es el cerco convexo o CH (Convex Hull); este crea un subconjunto S de un lano denominado convexo si solo sí, cualquier ar de untos, q S; es decir el segmento q está contenido comletamente en S (ver Figura 3). El Cerco convexo CH(S) (se lee CH de S) es el más equeño conjunto convexo en S. Veamos el siguiente ejemlo: () Ingeniero Industrial. Profesor del Deartamento de Ingeniería de Sistemas e Informática, UNMSM. E-mail: eruizl@unmsm.edu.e () Ingeniero Industrial. Profesor del Deartamento de Ingeniería de Sistemas e Informática, UNMSM. E-mail: eraffol@unmsm.edu.e entrada :,, 3, 4, 5, 6 salida : 4, 5, 6, (ver Figura 4) MÉTODOS GEOMÉTRICOS ELEMENTALES Las alicaciones en geometría comutacional actúan sobre objetos geométricos simles: unto, línea olígono []. Puntos. Es el objeto fundamental, es considerado como un ar de enteros: las coordenadas habituales en el lano cartesiano. 69
>>> Geometría comutacional: el roblema del cerco convexo Figura. Área dividida en regiones Figura. Esquema del laneamiento del movimiento 4 S 5 3 q 7 6 Figura 3. El roblema del cerco convexo Figura 4. Un cerco convexo + 3 Figura 5. Una línea Figura 6. Vectores el roducto cruz (Positivo) anti horario horario (Negativo) 0 0 0 Figura 7. Sentido horario x Figura 8. Producto cruzado negativo 70
Ind. data 8(), 005 Edgar Ruiz L. Eduardo Raffo L. >>> Línea. Una línea es un ar de untos, que se suone están unidos or un segmento de línea recta. Para esecificar las roiedades de un segmento de línea recta, se define la combinación convexa de = (x, ) = (x, ), como un unto 3 = (x 3, 3 ); existiendo un α, tal que 0 α, 3 = α + (- α), siendo 3 un unto que está contenido en el segmento de línea (ver figura 5). x 3 = α x + (-α) x 3 = α + (-α) Considere los vectores ; su roducto cruzado x se interreta como el área del aralelogramo formado or (0,0),, + (ver figura 6); se define como: x x = det = x x x Si es ositivo, entonces es sentido horario de en caso que el roducto cruzado sea cero, se dice que son colineales. El roblema de determinar si dos segmentos consecutivos se encuentran a la izquierda o a la derecha: 0 con resecto a ; equivale a encontrar el ángulo entre 0. Utilizando el roducto cruzado se tiene que ( 0 ) x ( 0 ) En caso que el roducto cruzado sea negativo 0 es antihorario con resecto a 0 se encuentra a la izquierda. Un roducto cruzado ositivo es tomado como sentido horario con resecto a 0 es a la derecha. Al resecto ver la Figura 8. Se uede clasificar el unto P con resecto a una región. Así uede un unto P, encontrarse: a la izquierda, derecha, origen, destino, entre los dos untos, arriba o abajo (véase la Figura 9). SEGMENTOS DE LÍNEA Un segmento de línea 0, consiste de los untos finales 0 (véase Figura 0). Si o es el origen de un segmento de línea es el destino, entonces es un segmento de línea dirigido 0 ; denominado arco o borde (edge). Un arco osee dos untos finales: origen destino; or defecto el unto 0 es (0,0) destino es (,0). La rotación de un arco es mover a 90 en sentido horario los untos finales (véase la Figura ). donde: m = 0.5* ( - 0 ) = - 0 como n.( - 0 ) = 0, con - 0 = (x,) n = (,-x) origen = m - 0.5*n destino = m + 0.5*n Se observa que una doble notación o twice es la rotación de una rotación (Ver figura ) Para determinar el unto en t, se tiene que este es igual a 0 + t *( 0) Para ínter seccionar un objeto arco con otro denominado f, se tiene que: P(t) - C coincide con n.(p(t) - c) = 0 cd arriba destino destino izquierda entre derecha 0 origen origen abajo o Figura 9. Clasificación de P Figura 0. Segmento de línea 0 7
>>> Geometría comutacional: el roblema del cerco convexo, t = m (t) o n o, t = 0 Figura. Rotación o arco Figura. Rotación de rotación n.((a + t(b-a)) - c) = 0 n.(a - c) + tn.(b - a) = 0 dición es o.x sea diferente a.x (orque en otro caso es!): Si n.(b-a) es cero; se tiene que b-a d-c son erendiculares al vector n. Al clasificar el arco f, si este es LEFT o RIGHT retorna PARALELO; en otro caso COLINEAL. El valor de t es n.( a c) t = n.( b a) n.( a c) n.( b a) que indica que ha intersección, retornando INTER- SECCION (véase la Figura 3). Para evaluar la endiente (o sloe, en inglés), la con- endiente =. 0.. x 0. x El valor de la ordenada en base a la abscisa x (según la figura 4), es: = endiente *( x 0. x) + 0. EL PROBLEMA DEL CERCO CONVEXO Un olígono convexo[5], es un olígono con la roiedad de que cualquier segmento de recta cuos extremos estén en el olígono cae or comleto dentro d (t) = a + t(b-a) (x,) n objeto b arco f endiente a c o Figura 3. Intersección Figura 4. El conceto de endiente de una recta 7
Ind. data 8(), 005 Edgar Ruiz L. Eduardo Raffo L. >>> 5 3 6 4 0 8 5 9 6 7 L Figura 5. P 6 no forma arte del cerco Figura 6. Un cerco convexo del olígono. El roblema del cerco convexo consiste en encontrar el área más equeña de un olígono convexo que encierre un conjunto de untos en el lano. Como se vio anteriormente, las figuras 3 4 resentan un cerco convexo, así también la Figura 6. Sea un conjunto S en el lano; P un unto en S. Se dice que P es un unto del cerco, si existe una línea L a través de P, tal que todos los untos en S exceto P, se encuentran a un lado de L (exceto P, ninguno ertenece a la línea). En la Figura 5, 6 no es un unto del cerco or encontrarse a un lado de L. El cerco convexo de un conjunto finito de untos S, consiste de untos del cerco ordenados que se encuentran en el borde de S. Para la Figura 6 el cerco convexo es la secuencia de los untos,, 3, 4, 5. El cerco convexo de un conjunto finito de untos S en el lano, es la secuencia,,..., n de untos de cercos de S en el siguiente orden:. El unto es el unto con la coordenada mínima ( es un unto de cerco).. Para i, sea α i el ángulo desde la horizontal al segmento de línea, i. Los untos, 3,..., n están ordenados tal que α i, α i,..., α n están en una secuencia ordenada. (Ver figura 7) En la Figura 8; tiene la mínima coordenada ; entonces este es el rimer unto listado en el cerco convexo. Como se muestra, los ángulos desde la horizontal a las líneas segmentos, ;, 3 ;, 4 ;, 5 crecen. ALGORITMO DE GRAHAM En el algoritmo de Graham (R.L. Graham, An efficient algorithm for determining the convex hull of a finite lanar set, Information Processing letters, 3-33; 97) los untos son ordenados de acuerdo al ángulo tomando un unto inicial. La secuencia o asos del algoritmo se resentan a continuación. a. Primero encontrar el unto con mínima coordenada ; en el caso que varios untos tengan el mismo valor, tomar el del mínimo valor de x. b. Ordenar todos untos de P de S de acuerdo al ángulo desde la horizontal al segmento de línea,. 4 α i i 5 6 0 8 9 7 α 3 α 3 α 4 α 5 Figura 7. P 6 no forma arte del cerco Figura 8. Un cerco convexo 73
>>> Geometría comutacional: el roblema del cerco convexo < 80º 0 > 80º 0 q izquierda derecha Figura 9. Comaración de ángulos Figura 0. Comarando: >q c. Finalmente examinar los untos en orden descartar aquellos que no están en el cerco convexo. Para imlementar la estrategia usada en el algoritmo, se desarrolla un camino ara comarar ángulos. El roducto cruzado determina cuando un unto no se encuentra en cerco convexo deberá ser descartado. Suonga que visita, 0 en ese orden los segmentos de línea 0, 0, tienen ángulos menores que 80º entonces 0 se mueve a la izquierda, en otro caso se mueve a la derecha. El roducto cruz de 0,, es: cross ( 0,, ) = ( - 0 ) (x - x 0 ) - ( - 0 ) (x - x 0 ) esto, imlica que se mueve a la izquierda si cross ( 0,, ) < 0. De igual manera 0,, se mueve a la derecha si cross ( 0,, ) > 0. Cuando cross ( 0,, ) = 0, entonces los untos 0,, son colineales. El algoritmo Graham toma sistemáticamente los untos q en el ordenamiento comara q. Si el roducto cross (,, q ) es < 0 entonces,, q se mueven a la izquierda; es decir > q. Al resecto examine el seudo código de la Figura. Sea el conjunto S ordenado de acuerdo a sus ángulos (véase Figura ). El algoritmo examina, 3, 4, moviéndose hacia la izquierda, luego es retenido. Desués se examina, 3, 4, reteniéndose 3 (ver Figura 3). Graham (, n, k ) if (n = ) then k = retorno min = for i = to n if ( [ i ]. < [ min ]. ) then min = i for i = to n if ( [ i ]. < [ min ]. ) and ( [ i ].x < [ min ].x) then min = i Intercambiar ( [ i ], [ min ] ) Ordenar,..., n de acuerdo al ángulo [ 0 ] = [ n ] k = for i = 3 to n while ( cross ( [ k ], [ k- ], [ i ] ) > 0 ) k = k k = k + Intercambiar ( [ i ], [ k ] ) End. Graham 0 9 8 7 6 5 4 3 Figura. Seudo código ara el algoritmo de Graham Figura. Conjunto S de untos 74
Ind. data 8(), 005 Edgar Ruiz L. Eduardo Raffo L. >>> 4 4 3 5 3 Figura 3. Encontrando, 3, 4 Figura 4. Examinando 3, 4, 5 6 4 3 Figura 5. Obteniendo 6 Figura 6. Salida ara Graham.java /*** * Autor :E.Raffo Lecca E. Ruiz Lizama * Fecha :/05/004 ***/ imort PointD; ublic class Graham rivate int n; rivate int k; rivate PointD untos[];// untos en el conjunto S ublic static PointD[] hull; ublic Graham(int m) untos=new PointD[m+]; untos[m]=new PointD(); ublic Graham() this(0);// or defecto ublic void add(pointd ) if(n<untos.length-) untos[n++]=; rivate void swato(pointd,pointd q) PointD tem=new PointD();.assign(q); q.assign(tem); ublic void convexhull() int i,j; PointD ; if(n==) return; // encontrar el unto inicial int min=; for(i=;i<n;i++) if(untos[i].gety()<untos[min].gety()) Figura 7a. Código del archivo7 Graham.java 75
>>> Geometría comutacional: el roblema del cerco convexo min=i; for(i=0;i<n;i++) if(untos[i].gety()<untos[min].gety() untos[i].getx()<untos[min].getx()) min=i; // intercambiar swato(untos[0],untos[min]); // ordenar for(i=0;i<n-;i++) for(j=i+;j<n;j++) =PointD.resta(untos[i],untos[0]); double angi=.olar(); ]), =PointD.resta(untos[j],untos[0]); double angj=.olar(); && if(angj<angi) swato(untos[i],untos[j]); // iteracion untos[n].assign(untos[0]); k=; for(i=;i<=n;i++) while(pointd.cross(pointd.resta(untos[k],untos[k- PointD.resta(untos[i],untos[k- ]))<0) PointD[k]; PointD(untos[i]); k--; k++; swato(untos[i],untos[k]); // leer Puntos ublic PointD[] getpuntos() return untos; // hull: la solucion ublic PointD[] hull() int i; PointD[] hull=new for(i=0;i<k;i++) hull[i]=new return hull; Figura 76. Código del archivo7 Graham.java En la siguiente iteración examina 3, 4, 5 se retiene 4 (ver figura 4). Al examinar 4, 5, 6 se descarta 5 se regresa a 3, 4, 6, se retiene 4. Al examinar 4, 6, 7 se retiene 6. En la siguiente se examinan 6, 7, 8 se retiene 7. En 7, 8, 9 se descarta 8. El algoritmo regresa a 6, 7, 9 se descarta 7. El algoritmo regresa a 4, 6, 9 se retiene 6. A continuación se resenta el código JAVA ara el archivo Graham.java (Figura 7: a b). La animación desde un alet, se resenta en la Figura 6. Los archivos: PointD.java, JgrahamShow.java, JgrahamShow.html, se encuentran en [3]. CONCLUSIONES El artículo resenta los concetos fundamentales de la geometría comutacional una solución a uno de los roblemas clásicos en este camo: el cerco convexo. La solución es imlementada en un alet de Java, el mismo que arovecha la interfase grafica ara resentar una animación de un olígono (cerco convexo) en la salida estándar. BIBLIOGRAFÍA. Laszlo, M. J. (996). Comutational Geometr and Comuter Grahics in C++. Prentice-Hall, Inc, U.S.A.. Prearata, F. P.; Michael Ian Shanos. (988). Comutational Geometr An Introduction. Sringer- Verlag. U.S.A. 3. Raffo Lecca, E. (005). Curso: Mi Primer Java. En: htt://industrial.unmsm.edu.e/org/aa/daisi/ eraffol/website/index.htm 4. Cormen, Thomas; Leiserson, Charles; Rivest, Ronald, and Stein, Clifford. (00). Introduction To Algorithms. Second Edition. McGraw-Hill Book Coman and MIT Press. U.S.A. 5. Weiss, Mark A. (00). Data Structures and Problem Solving Using Java. Second Edition. Adisson-Wesle. U.S.A. 76