• No se han encontrado resultados

Algoritmo de Weiler-Atherton con Polígonos de Visibilidad

Parte II Métodos aproximados en problemas

8.2 Unión de Polígonos de Visibilidad

8.2.1 Algoritmo de Weiler-Atherton con Polígonos de Visibilidad

Existen algoritmos que permiten construir la unión de dos polígonos utilizando técnicas de recorte. En este sentido podemos mencionar los algoritmos de Liang-Barsky, Cyrus-Beck, Cohen- Sutherland, Nicholl-Lee-Nicholl y Weiler-Atherton, (ver [44, 56]). Todos ellos están relacionados con el recorte de segmentos y polígonos y permite construir el polígonounión de dos polígonos planos P1 y P2. Daremos una breve descripción del algoritmo de Weiler-Atherton, que nos

permita determinar posibles adaptaciones de este algoritmo cuando los polígonos P1 y P2 son

polígonos de visibilidad de dos puntos t1 yt2 interiores a un polígonoP.

La idea básica en el algoritmo de recorte deWeiler-Atherton consiste en recorrer alternativa- mente el borde de cada polígono hasta encontrar un punto de intersección, construyendo como

veremos más adelante el polígono unión. Para simpliÞcar la exposición denotaremos en lo que sigue a un polígono P sin agujeros de vértices x1, x2, ..., xn conP(x1, x2, ..., xn).

Según se ha mostrado en la Proposiciones 8.2.1 y 8.2.2 la unión de polígonos de visibilidad puede estar formada por varias componentes conexas, que a su vez pueden contener agujeros. En este sentido generalizaremos el concepto de polígono, diciendo que un polígono es un conjunto de componentes poligonales no conexas que pueden ser de dos tipos: componentes “principales” y componentes “agujeros”, de tal forma que toda componente “agujero” esta contenida en una componente “principal”. La diferencia esencial entre componentes “agujeros” y componentes “principales”, impuesta por la aplicación del algoritmo, radica en que el recorrido de ambos tipos de polígonos es inverso, es decir, que las componentes principales se recorrerán en sentido positivo y los agujeros en sentido negativo.

Como todopolígono de visibilidad es un polígono sin agujeros y por tanto una componente “principal”, para calcular la unión de k polígonos de visibilidad será suÞciente ir uniendo cada polígonoV(P, ti), con las componentes, (agujeros o principales), resultado de unir lospolígonos de visibilidad de los puntos anterioresV(P, t1, ..., ti−1). Además como veremos más adelante la unión

de dos componentes “principales” puede producir otras componentes “principales” o “agujeros”, mientras que la unión de una componente “principal” con un “agujero” producirá un agujero recorte de éste, (si no está contenido en la componente “principal”), más la propia componente “principal”. Exponemos en el Ejemplo 8.2.5 un caso particular para la unión de un polígono con un agujero, (una componente “principal” y una componente “agujero”) y otro sin agujeros, (una única componente “principal”). Como se puede observar aparece una componente agujero nueva que queda orientada negativamente. En el Apéndice B se detallan las implementaciones y las estructuras de datos necesarias para la construcción de la unión de polígonos de visibilidad.

Descripción del algoritmo de Weiler-Atherton

Inicialmente el algoritmo parte de un vértice exterior de uno de los polígonos, avanzando en dicho polígono hasta encontrar un punto de intersección, para saltar en ese momento a un vértice del segundo polígono. Podemos describir el algoritmo con los siguientes pasos:

ENTRADA: Dos polígonosP1(a1, a2, .., at) yP2(b1, b2, .., bt).

SALIDA: El polígono uniónP1(a1, a2, .., at)∪P2(b1, b2, .., bt). • Preparación:

1. Determinar los puntos de intersección deP1 yP2.

2. Crear dos listas circularesL1 yL2 que se obtienen al recorrer los vértices de P1 yP2

respectivamente, e incluir los puntos de intersección encontrados entre cada par de vértices.

• Cálculo:

2. Seguir los nodos de la lista L1 hasta encontrar un punto p1 de intersección e incluir

todos los nodos analizados, en la lista resultado, (que serán los vértices del polígono unión).

3. Buscar el punto p1 en la lista L2.

4. Seguir todos los nodos de la lista L2 a partir de p1, hasta encontrar un puntop2 de

intersección e incluir todos los nodos analizados en la lista resultado.

5. Volver a la lista L1 y repetir el proceso hasta encontrar en el punto de partida a1.

El algoritmo deWeiler-Atherton es sencillo en su implementación, pero teniendo en cuenta la naturaleza de lospolígonos de visibilidad, es frecuente que se compartan vértices entre un par de polígonos que debemos unir. En este caso el algoritmo deWeiler-Atherton descrito necesitará añadir condiciones adicionales como se muestra en el siguiente ejemplo.

Ejemplo 8.2.3 Sean los polígonos triangulares P1(a1, a2, a3) y P2(b1, b2, b3) de la Figura 8.2 y

tal que a2 =b2. Evidentementea2 yb2 son puntos de intersección.

a1 a2 a3 b1 b2 b3

p1 p2

Figura 8.2:Un ejemplo del algoritmo de Weiler-Atherton

Si calculamos las listas circulares marcando los puntos con v para los vértices y c para los puntos de cortes tenemos:

OL1 ={[a1, v],[a2, c],[a3, v],[p1, c],[p2, c],[a1, v]}

OL1 ={[b1, v],[p2, c],[b2, c],[p1, c],[b3, v],[b1, v]}

Aplicando el algoritmo tendríamos el polígono suma determinado por los vértices:

P1∪P2={a1, a2, p1, p2, b2, p1, p2, b2, ...}

probando así que la construcción entra en bucle inÞnito, que no determina por consiguiente el polígono unión.

Por tanto, necesitamos añadir condiciones adicionales cuando utilizamos el algoritmo de Weiler-Atherton para unir polígonos de visibilidad. Analizamos éstas en el siguiente apartado.

Condiciones adicionales

Las diÞcultades del algoritmo deWeiler-Atherton aparecen cuando nos encontramos puntos de intersección que son vértices de alguno de nuestros polígonos P1(a1, a2, .., ak) ó P2(b1, b2, .., bt), como sucede en el caso a2 = b2. En este caso debemos distinguir si el siguiente vértice en el

polígono en curso, (en nuestro casoa3 deP1), se encuentra en el interior o en el exterior del otro

polígono, (en nuestro caso P2). En el caso de que el siguiente vértice se encuentre exactamente

sobre el borde la decisión será indistinta, como se analiza a continuación.

Supongamos que existe un punto de intersección que coincide con vértices de P1 y P2, sea

ai = bi. Distinguimos tres casos que se representa en la Figura 8.3, según la posición de los vértices ai+1 ybi+1 de P1 yP2 respectivamente. bi+1 ai bi

ai+1 1º Caso ai bi

ai+1 3º Caso bi+1 ai bi

ai+1 2º Caso bi+1

Figura 8.3:Puntos de Intersección sobre los vértices

Analizando cada uno de los casos se veriÞca que¡aiai+1×bibi+1¢ > 0 en el primer caso, ¡

¯

aia¯õ+1×bibi+1 ¢

= 0en el segundo caso y¡aiai+1×bibi+1 ¢

<0en el útimo caso. Por tanto será necesario modiÞcar el algoritmo de Weiler-Atherton cuando se aplica a polígonos de visibilidad, añadiendo una función de chequeo en el punto 3 del cálculo. Además si partimos de un punto vértice y no tenemos en cuenta si han sido visitados todos los puntos de corte, pueden quedar algunas componentes, (agujeros o principales), sin analizar, como se puede apreciar en el Ejemplo 8.2.5 si partimos del vérticea. Así, podríamos describir dicho cálculo parapolígonos de visibilidad de la siguiente manera:

• Cálculo: SeaC ={p1, ..., ps}la lista de todos los puntos de corte.

1. Tomar el primer punto de cortep1, eliminarlo deC y buscarlo en la lista L1.

2. Seguir los nodos de la listaL1 hasta encontrar un puntop2 de intersección, eliminar

p2 de C e incluir todos los nodos analizados, en la lista resultado, (que serán los

vértices del polígono unión). Sea ai el punto siguiente a p2 enL1.

3. Buscar el puntop2 en la listaL2. Si llamamosbi el punto siguiente ap2 en L2, pasar

a 4 si¡p2ai×p2bi

¢

<= 0. En caso contrario pasar a 5.

4. Seguir todos los nodos de la listaL2 a partir de p2, hasta encontrar un puntop3 de

intersección e incluir todos los nodos analizados en la lista resultado.

5. Volver a la listaL1 y repetir el proceso hasta encontrar en el punto de partidap1. En

este caso se ha encontrado una componente conexa que puede ser “agujero”, (si está orientada negativamente), o “principal”, (si está orientada positivamente).

6. SiC 6= volver a1.

Nota 8.2.4 Evidentemente la modiÞcación expuesta para el Algoritmo de Weiler-Atheton es aplicable también cuando el punto de intersección sea sólamente vértice de uno de los polígonos y no de los dos.

Además las ampliaciones realizadas sobre el algoritmo de Weiler-Atherton no reducen la complejidad en el cálculo de los puntos de intersección de una arista aiai+1 con un polígono

P(x1, x2, ..., xn), (que seráO(n2)), al tener que contrastar dicha arista con todos los vértice de

P. La cotaO(n2)se puede reducir aplicando una técnica de barrido, (ver [10]), para calcular las x intersecciones den segmentos y que permite obtener una complejidadO((n+x) logn).

Presentamos a continuación un ejemplo para la unión de un polígono P1 formado por una

componente “principal” A y un “agujero” B, con otro polígono P2 formado por una única

componente “principal” C, (debe recordarse que todo polígono de visibilidad está formado por una única componente “principal”, por tanto, el mecanismo seguido en este ejemplo es el seguido para unir elpolígono de visibilidad de un puntotiinterior al polígonoP,V(P, ti), con el conjunto de componentes, (agujeros y principales), resultantes de unir lospolígonos de visibilidadde todos los puntos t1, ..., ti−1, V(P, t1, ..., ti−1).

Ejemplo 8.2.5 Consideremos dos polígonos P1 y P2, tal que P1 está formado por una compo-

nente “principal” A de vértices A={a1, a2, a3, a4} orientada en sentido positivo y una compo-

nente agujeroB de vérticesB={b1, b2, b3, b4}orientada en sentido negativo y P2 está generada

por una única componente principal Cde vérticesC ={c1, c2, c3, c4, c5, c6, c7, c8}orientada posi-

tivamente. Sean l1, l2, l3, l4, l5 y l6 los puntos de intersección de P1 y P2.

A B C a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 c5 c6 c7 c8 l1 l2 l3 l4 l5 l6

Figura 8.4:Un ejemplo de unión de polígonos con agujeros

Para calcular el polígono unión deP1 y P2 se debe calcular la unión de C, (que es la única

1. Calculando las listas circulares correspondientes y aplicando el algoritmo, se puede apreciar en la Figura 8.5, como la unión de las componentes principalesA deP1 yCdeP2, produce

una nueva componente princial D de P1∪P2 con vértices D ={l1, a4, l6, c8, c1, c2, c3, c4}

y una componente agujero E, también de P1∪P2, de vértices E ={l2, c5, c6, l3}.

2. Por otra parte, la unión de la componente agujero B de P1 y la componente principal C

de P2, produce una componente agujero F de P1∪P2, que es un recorte de B de vértice

F ={l4, l5, b2, b3}. D F C a4 b2 b3 c1 c2 c3 c4 c5 c6 c8 l1 l2 l3 l4 l5 l6 E

Figura 8.5:Resultado de la unión de los polígonos de la Figura 8.4

A modo de ejemplo presentamos en la Figura 8.6 el polígono producido por la implementación realizada en esta memoria del algoritmo de Weiler-Atherton para la unión de polígonos de visibilidad. En laÞgura (a) presentamos el polígono inicial; en laÞgura (b) visualizamos también un conjunto luces interiores al polígono; en la Þgura (c) presentamos el polígono resultante de unir todos los polígonos de visibilidad correspondientes a las luces interiores y por último en la Þgura (d) mostramos todos los elementos conjuntamente. Como se puede apreciar la unión de polígonos de visibilidad puede ser un polígono formado por varias componentes conexas con agujeros. Para el cálculo del área de este tipo de polígonos se han triangulado todos las componentes del polígono, (agujeros y principales), utilizando un algoritmo Scan de Graham para triangulación de polígonos simples [68], se ha calculado el área de todas las componentes, de tal forma que sumando el área de todas las componentes “principales” y restando el área de las componentes “agujeros” tenemos el área del polígono unión. Para comparar el porcentaje de área iluminado se ha repetido también el mismo proceso de triangulación sobre el polígono inicial P, como se mencionó en el capítulo anterior. Los códigos para la construcción de la unión de polígonos de visibilidad así como las programas para las visualización con el paquete matemáticos Matlab se puede encontrar en el Apéndice B de listados.

Una vez descrito el mecanismo para unirpolígonos de visibilidad utilizado, podemos contruir ya la función de costes o función objetivo de nuestros métodos aproximados. Exponemos a continuación los elementos diseñados en las heurísticas que solucionan el problema MaxA-p- Pvk(P,k).

(a) (b)

(c) (d)

Figura 8.6:La unión de polígonos de visibilidad puede ser un polígono no conexo con agujeros.

8.3

El problema

MaxA-p-Pvk(P,k)

con

simulated annealing-SA