Geometria Computacional Prof. Walter Mascarenhas Segundo semestre de 2004 Aula 5 Triangulação em O(n logn) 1- Ordene os pontos pela coordenada y O(n logn) 2- Decomponha o polígono em trapézios usando uma scanline O(n logn) 3- Usando os trapézios, quebre o polígono em partes monótonas através da eliminação das cúspides internas O(n) 4- Triangule as partes monótonas O(n) Vértices reversos e cúspides internas Um vértice v de um polígono P é reverso se o seu ângulo interno é estritamente maior que pi. Um vértice reverso r é uma cúspide interna de P com relação à reta r se seus dois vizinhos estão contidos no mesmo semi-plano fechado definido pela paralela a r que passa por v. Partição em trapézios Um polígono particionado em trapézios (triângulos são trapézios degenerados.) Note que o lado inferior de cada trapézio contém exatamente um vértice e o superior também Método da scanline Algoritmo: 1- Entrada: Polígono 2- Saída: lista de trapezóides, onde struct Trapezoide { int ladoDireito; int ladoEsquerdo; int verticeInferior; int verticeSuperior; }; Algoritmo: 1- Usar estrutura de dados que permita busca, inserção e remoção em O(log n) comparações para armazenar os lados cortados pela scanline 2- Armazenar os vértices em um vetor ordenado pela coordenada y. 3- For( i = 0; i < nVertices; i++) trateVertice(i) A estrutura de dados que mantém os lados é ordenada assim: int compare(lado1, lado2) { x1 = xDoCorte(lado1,scanline); x2 = xDoCorte(lado2,scanline); if( x1 < x2 ) return -1; if( x1 > x2 ) return 1; return compareInclinacoes(lado1,lado2); } Importante: esta comparação não se altera quando a scanline move. Se dois lados estão na estrutura de dados em dois momentos diferentes, então o resultado da comparação será o mesmo nos dois instantes. Trate vértice: 6 casos 1- Dois lados acima da scanline 1.1 Vértice reverso 1.2 Vértice convexo 2- Dois lados abaixo da scanline 2.1 Vértice reverso 2.2 Vértice convexo 3- Lados em lados opostos 3.1 Polígono à esquerda 3.2 Polígono à direita 1- Dois lados acima da scanline 1.1 Vértice reverso: completar o trapézio ativo e inserir os dois lados. Atualizar o vértice inferior dos lados adjacentes 1.2 Vértice convexo: inserir os lados. 2- Dois lados abaixo da scanline 2.1 Vértice reverso. Completar os dois trapézios, remover os lados adjacentes e atualizar os vértices inferiores dos lados vizinhos 2.2 Vértice convexo. Completar o trapézio e remover os lados 3- Lados em lados opostos da scanline 3.1 Polígono à esquerda: Completar o trapézio, usando o lado adjacente esquerdo. Remover lado de baixo, inserir lado de cima, atualizar vértice de baixo do lado adjacente esquerdo. 3.2 Polígono à direita. Completar o trapézio, usando o lado adjacente direito. Remover lado de baixo, inserir lado de cima, atualizar vértice de baixo do lado adjacente direito. O que fazer com y’s repetidos? 1- Rotacionar a scanline, escolher outra direção 2- Rotacionar o polígono 3- Simular uma rotação muito pequena Efeitos colaterais 1- Rotacionar a scanline, escolher outra direção: Calcular interseções com retas inclinadas é mais caro do que com retas horizontais. Além disso, como escolher uma “boa” direção? 2- Rotacionar o polígono: As coordenadas dos vértices deixam de ser inteiras. Como achar um bom ângulo de rotação? 3- Simular uma rotação muito pequena. Como? Rotação simulada Rotacione os vértices por um ângulo minúsculo. Qual ângulo? Se for minúsculo, não importa! Rotação simulada Rotação simulada E as interseções com a scanline? Para cada lado horizontal no polígono original, a interseção com a scanline será o primeiro vértice quando ele entra na estrutura de dados e o segundo vértice logo em seguida, quando ele sairá.