Triangulación de Polígonos comp-420 Triangulación de polígonos Triangulación: descomposición de un polígono simple en triángulos. Cualquier triangulación de un polígono simple con n vertices tiene n-2 triángulos. El algoritmo más simple, llamado de corte de orejas (ear clipping) es de orden O(n2). El método antes visto para particionar polígonos en partes monotonas es útil porque podemos triangularlas con complejidad O(n). Ear clipping triangulation Una oreja de un polígono es un triángulo formado por tres vertices consecutivos dentro del cual no hay otro vértice del polígono. El segmento de recta entre vi-1 e vi+1 se llama diagonal. El vértice vi se llama punta de la oreja. Un triángulo consiste en una sola oreja aunque se puede poner como punta de la oreja cualquiera de los tres vértices. Un polígono de cuatro o más lados siempre tiene al menos dos orejas que no traslapan ( probado por G.H. Meisters, Polygons have ears, Amer. Math. Monthly). Esto sugiere un algoritmo recursivo para la triangulación. Si podemos encontrar una oreja en un polígono con n≥4 vertices y removerla, tendremos un polígono de n-1 vertices y podemos repetir el proceso. Una implementacion inmediata tomaría O(n3). D. Eberly. Geometric Tools. (www.geometrictools.com) Ear clipping triangulation Almacenar el polígono como una lista doblemente ligada de manera a poder eliminar rapidamente las puntas de las orejas: construir la lista toma O(n). Iterar sobre los vertices para encontrar orejas. para cada vértice vi y su triángulo correspondiente (vi-1, vi, vi+1) (el indexado es módulo n por lo que vn=v0 y v-1 = vn-1) probar todos los otros vértices para ver si hay alguno dentro del triángulo. Si no hay ninguno dentro del triángulo es una oreja, si hay al menos uno no lo es. D. Eberly. Geometric Tools. (www.geometrictools.com) Ear clipping triangulation Es suficiente considerar solamente los vertices reflex para ver si estan contenidos en el triangulo. vertice reflex - el ángulo interior formado entre las dos aristas que lo comparten es mayor a 180 grados. vertex convex - el ángulo interior formado entre las dos aristas que lo comparten es menor a 180 grados. La estructura de datos de polígono mantiene 4 listas doblemente ligadas simultáneamente: los vertices del polígono en una lista ligada cíclica, los vertices convex en una lista lineal, los vertices reflex en una lista lineal, las puntas de orejas en una lista ligada cíclica. D. Eberly. Geometric Tools. (www.geometrictools.com) convex reflex Ear clipping triangulation Una vez construida la lista inicial de vertices reflex y orejas, se eliminan las orejas una a una. si vi es una oreja que se elimina, la configuracion de la arista en los vertices adyacentes puede cambiar. Si el vertice adyacente es... convexo es facil convencerse que va a seguir siendo convexo. oreja, no se queda oreja necesariamente despues de eliminar a vi. reflex, es posible que se vuelva convex o posiblemente oreja después de eliminar a vi. Despues de eliminar a vi, si un vertice adyacente es convex, probar si es una oreja iterando sobre los vertices reflex y probando si estan contenidos en el triangulo de ese vertex. Hay O(n) orejas, hay que verificar O(n) veces por oreja. El proceso total de eliminación de orejas toma O(n2). D. Eberly. Geometric Tools. (www.geometrictools.com) Ear clipping triangulation 6 9 5 8 4 Vertices reflex R = { 2, 5, 7, 8 } 7 0 Vertices convex C = { 0, 1, 3, 4, 6, 9 } 2 Vertices oreja E = { 3, 4, 6, 9 } 3 1 D. Eberly. Geometric Tools. (www.geometrictools.com) Ear clipping triangulation Vertices convex C = { 0, 1, 3, 4, 6, 9 } 6 9 5 8 4 Vertices reflex R = { 2, 5, 7, 8 } 7 0 Vertices oreja E = { 3, 4, 6, 9 } 2 3 1 Eliminar oreja 3 : Primer triangulo en la triangulación T0 = ⟨ 2, 3, 4⟩. D. Eberly. Geometric Tools. (www.geometrictools.com) Triangulación de un polígono monónoto Sea P un polígono monótono respecto a y con n vértices. Suponemos que P es estrictamente monótono (que no contiene aristas horizontales) Siempre podemos ir hacia abajo al “caminar” en las fronteras izquierda o derecha del polígono a partir del vértice más alto de P hasta el más bajo. Podemos seguir a P desde arriba hacia abajo en ambas cadenas en su frontera agregando diagonales cuando sea posible. Este es un algoritmo glotón: conectamos la mayor parte de vértices posible con diagonales en cada iteración. Triangulación de un polígono monónoto El algoritmo maneja los vértices en orden decreciente de su coordenada y. Se requiere una estructura auxiliar: una pila (stack) Inicialmente, esta pila está vacía, luego contiene los vértices de P que se han encontrado (al paso de la línea de barrido) pero que necesitan más diagonales. Al manejar un vértice se le añaden tantas diagonales con los vértices de la pila como sea posible. Estas diagonales dividen al polígono en triángulos. El vértice más bajo será el que esté arriba en la pila. Triangulación de un polígono monónoto not contain horizontal edges. Thus we always go down when we walk on the left or right boundary chain of P from the highest vertex of P to the lowest POLYGON TRIANGULATION one. This is the property that makes triangulating a monotone polygon easy: top toque bottom both chains, adding our way through P from La porción de P que we nocanhawork sido triangulada pero seonencuentra arriba diagonals whenever this is possible. Next we describe the details of this greedy del último vértice visitado tiene forma de embudo. triangulation algorithm. Chapter 3 triangles split off not yet triangulated popped The algorithm handles the vertices in order of decreasing y-coordinate. If two Una frontera dely-coordinate, embudo deoneparte defirst. una vertices have the same thenconsta the leftmost is handled The algorithm requires a stack sola arista de P . S as auxiliary data structure. Initially the stack is empty; later it contains the vertices of P that have been encountered but may still need more diagonals. When we handle a vertex we add as many diagonals Lafrom otra frontera esonuna cadena queThese consta desplit losoff this vertex to vertices the stack as possible. diagonals P. The (reflex), vertices thates have been handled but notcuyo split off—the triangles from vértices reflejo decir, aquellos ángulo vertices on the stack—are on the boundary of the part of P that still needs to be interior al menos 180°. triangulated.es Thede lowest of these vertices, which is the one encountered last, is on top of the stack, the second lowest is second on the stack, and so on. The P that still needs to bealto triangulated, and lies above the last that part ofel Solo vértice más (el más profundo envertex la pila) has been encountered so far, has a particular shape: it looks like a funnel turned esupside convexo. down. One boundary of the funnel consists of a part of a single edge of P, and the other boundary is a chain consisting of reflex vertices, that is, the ◦ . Only the highest vertex, which is interior angle at these vertices is at least 180durante Esta propiedad se mantiene toda la at the bottom of the stack, is convex. This property remains true after we have ejecución delvertex. algoritmo handled the next Hence, it is (invariante). an invariant of the algorithm. Now, let’s see which diagonals we can add when we handle the next vertex. We distinguish two cases: v j , the next vertex to be handled, lies on the same chain as the reflex vertices on the stack, or it lies on the opposite chain. If v j lies on the opposite chain, it must be the lower endpoint of the single edge e triangulation algorithm. The algorithm handles the vertices in order of decreasing y-co vertices have the same y-coordinate, then the leftmost one is h algorithm requires a stack S as auxiliary data structure. Init empty; later it contains the vertices of P that have been enco still need more diagonals. When we handle a vertex we add as from this vertex to vertices on the stack as possible. These di triangles triangles from P. The vertices that have been handled but n manejar un vértice vj distinguimos entre dos casos. split off vertices on the stack—are on the boundary of the part of P tha triangulated. The lowest of these vertices, which is the one en vj se encuentra en la misma cadena queof los vértices reflejo dethe stack on top the stack, the second lowest(dentro is second on still needs to be triangulated, and lies above th part of P that la pila). Se puede triangular a los vértices inmediatamente superiores has been encountered so far, has a particular shape: it looks lik sobre la mismanotcadena. upside down. One boundary of the funnel consists of a part of yet P, and the other boundary is a chain consisting of reflex ver triangulated vj se encuentra en la cadena opuesta a los reflejo debe elthe highes interior anglevértices at these vertices is at least 180◦ser . Only at the bottom of the stack, convex. This property remains tr vértice inferior de la arista frontera del embudo. Se ispueden agregar to Hence, which aitdiagonal was added or, algorit if no d handled the last nextvertex vertex. is an invariant of the diagonales a todos vértices de la pilaNow, excepto estará added, it isal theúltimo neighbor ofque v jwe onya the boundary P—see let’s see which diagonals can add whenofwe handlF popped conectado con vj. We distinguish two cases: v j , the next vertex to be handled, popped and chain as the reflex vertices on pushed the stack, or it lies on the oppo lies on the opposite chain, it must be the lower endpoint of t bounding the funnel. Due to the shape of the funnel, we can ad popped e v j to all vertices currently on the stack, except for the last one at the bottom of the stack); the last vertex on the stack is the u pushed so it is already connected to v j . All these vertices are poppe The untriangulated part of the polygon above v j is bounded that connects v j to the vertex previously on top of the stack a vj vj popped and extending downward from this vertex, so it looks like a funnel pushed pushed is preserved. This vertex and v j remain part of the not yet trian ¿Dónde agregar diagonales? Al pushed pushed Triangulación de un polígono monónoto has been done we push v j onto the stack. In both cases the invariant is restored: one side of the funnel is bounded by a part of a single edge, and the other side is bounded by a chain of reflex vertices. We get the following algorithm. (The algorithm is actually similar to the convex hull algorithm of Chapter 1.) Algorithm T RIANGULATE M ONOTONE P OLYGON(P) Input. A strictly y-monotone polygon P stored in a doubly-connected edge list D. Output. A triangulation of P stored in the doubly-connected edge list D. 1. Merge the vertices on the left chain and the vertices on the right chain of P into one sequence, sorted on decreasing y-coordinate. If two vertices have the same y-coordinate, then the leftmost one comes first. Let u1 , . . . , un denote the sorted sequence. 2. Initialize an empty stack S, and push u1 and u2 onto it. 3. for j ← 3 to n − 1 4. do if u j and the vertex on top of S are on different chains 5. then Pop all vertices from S. Insert into D a diagonal from u j to each popped vertex, 6. except the last one. 7. Push u j−1 and u j onto S. 8. else Pop one vertex from S. 9. Pop the other vertices from S as long as the diagonals from u j to them are inside P. Insert these diagonals into D. Push the last vertex that has been popped back onto S. 10. Push u j onto S. 11. Add diagonals from un to all stack vertices except the first and the last one. How much time does the algorithm take? Step 1 takes linear time and Step 2 the same side as the the stack 0 1 2 3 4 6 5 7 8 10 9 11 12 13 14 15 16 18 17 19 21 20 22 23 24 0 0 1 1 2 2 3 4 3 4 6 5 6 5 7 7 8 10 9 8 10 9 11 12 13 14 11 12 13 15 14 16 18 17 15 16 18 17 19 19 20 21 20 21 22 22 23 23 24 24 0 0 1 1 2 2 3 4 3 4 6 5 6 5 7 7 8 10 9 8 10 9 11 11 12 14 15 13 12 14 15 13 16 16 18 17 18 17 19 21 19 20 21 22 20 22 23 23 24 24 Triangulación de un polígono monónoto El paso 1 toma tiempo lineal El paso 2 toma tiempo constante El ciclo for se ejecuta n-3 veces, una ejecución puede tomar tiempo lineal. En cada ejecución del ciclo for se insertan a lo más dos vértices en el stack, entonces el número total de inserciones en el algoritmo está acotado por 2n-4. Como el número de operaciones pop no puede exceder el número de operaciones push, el tiempo total de ejecuciones para el ciclo for es O(n). El último paso del algoritmo toma a lo más tiempo lineal. El algoritmo se ejecuta en O(n).