Desafio 5 FUNDAMENTOS DA COMPUTAÇÃO GRÁFICA ALUNO: THIAGO RIBEIRO DA MOTTA MATRÍCULA: PERÍODO:
Desafio 5 – Opposite e CHE table 1) Tendo como entrada o vetor que descreve a triangulacao, implemente um algoritmo linear com o numero de triangulos (ou numero de arestas e vertices) para construir a tabela de opposites (O) da Corner Table. Dica: Use o vetor de triangulacao para construir uma lista de adjacencia de vertices para corner. Alem disso, lembre-se que o vetor de triangulacao funciona como um conversor de vertice para corner. 2) Altera o algoritmo de 1) para construir a tabela de opposites (O) da CHE. O programa deve ler um arquivo de entrada e escrever um arquivo de saida com o vetor de opposites.
1. Opposite Table Tc (Tabela de Corner) = { {0, 1}, {1, 2}, {2, 0}, {3, 4}, {4, 5}, {5, 3}, {6, 7}, {7, 8}, {8, 6}, {9, 10}, {10, 11}, {11, 9}, {12, 13}, {13, 14}, {14, 12}, {15, 16}, {16, 17}, {17, 15} } Tv (Tabela de Vértices) = { {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1}, {3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0}, {1, 5}, {5, 6}, {6, 1}, {3, 1}, {1, 6}, {6, 3} } V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Aresta
1. Opposite Table Tc (Tabela de Corner) = { {0, 1}, {1, 2}, {2, 0}, {3, 4}, {4, 5}, {5, 3}, {6, 7}, {7, 8}, {8, 6}, {9, 10}, {10, 11}, {11, 9}, {12, 13}, {13, 14}, {14, 12}, {15, 16}, {16, 17}, {17, 15} } Tv (Tabela de Vértices) = { {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1}, {3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0}, {1, 5}, {5, 6}, {6, 1}, {3, 1}, {1, 6}, {6, 3} } V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Aresta Implementado como um dicionário com pesquisa por Aresta ( in = Aresta, out = Indice) Implementado como um dicionário com pesquisa por Indice (in = Indice, out = aresta)
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução c = 0 n = 1 n1 = 2 V[n1] = V[2] = 2 V[n] = V[1] = 1 eVolta = Tv[2,1] = 5 Tv (Tabela de Vértices) = { {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1},...
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução eVolta = 5 m = Tc[5].y m = {5,3}.y = 3 p = 4 Tc (Tabela de Corner) = { {0, 1}, {1, 2}, {2, 0}, {3, 4}, {4, 5}, {5, 3},...
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução p = 4 O[0] = 4 O[4] = 0 Visitado[0] = true Visitado[4] = true
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução c = 1 n = 2 n1 = 0 V[n1] = V[0] = 0 V[n] = V[2] = 2 eVolta = Tv[0,2] = null Tv (Tabela de Vértices) = { {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1}, {3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0}, {1, 5}, {5, 6}, {6, 1}, {3, 1}, {1, 6}, {6, 3} }
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução c = 1 n = 2 n1 = 0 V[n1] = V[0] = 0 V[n] = V[2] = 2 eVolta = Tv[0,2] = null Não existe uma aresta que comece no Vértice 0 e vá para o Vértice 2.
1. Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução eVolta = null O[1] = -1 Visitado[1] = true
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
2. Compact Half-Edge (CHE) Table Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true
Opposite Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦n1 = Next(n) ◦eVolta = Tv[ V[n1], V[n] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].y ◦p = Next(m) ◦Se V[c] != V[p] ou V[n] != V[m] ◦O[c] = p ◦O[p] = c ◦Visitado[c] = true ◦Visitado[p] = true 2. Compact Half-Edge (CHE) Table Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução c = 0 n = 1 V[n1] = V[1] = 1 V[n] = V[0] = 0 eVolta = Tv[1,0] = 11 Tv (Tabela de Vértices) = { {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1}, {3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0},...
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução eVolta = 11 m = Tc[11].x = 11 Tc (Tabela de Corner) = { {0, 1}, {1, 2}, {2, 0}, {3, 4}, {4, 5}, {5, 3}, {6, 7}, {7, 8}, {8, 6}, {9, 10}, {10, 11}, {11, 9},...
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução eVolta = 11 m = Tc[11].x = 11 O[0] = 11 O[11] = 0 Visitado[0] = true Visitado[11] = true
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução c = 2 n = 0 V[n1] = V[0] = 0 V[n] = V[2] = 2 eVolta = Tv[0,2] = null Tv (Tabela de Vértices) = { {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1}, {3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0}, {1, 5}, {5, 6}, {6, 1}, {3, 1}, {1, 6}, {6, 3} } Pulei o exemplo de c = 1 por ser análogo ao exemplo de c = 0
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução c = 2 n = 0 V[n1] = V[0] = 0 V[n] = V[2] = 2 eVolta = Tv[0,2] = null Não existe uma aresta que comece no Vértice 0 e vá para o Vértice 2.
2. Compact Half-Edge (CHE) Table Para cada corner c ◦Se visitado[c] for false ◦n = Next(c) ◦ eVolta = Tv[ V[n], V[c] ] ◦Se eVolta for null ◦O[c] = -1 ◦Visitado[c] = true ◦Senão ◦m = Tc[eVolta].x ◦O[c] = m ◦O[m] = c ◦Visitado[c] = true ◦Visitado[m] = true V = 0, 1, 2, 1, 4, 2, 3, 4, 1, 0, 5, 1, 1, 5, 6, 3, 1, 6 C = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 Execução eVolta = null O[2] = -1 Visitado[2] = true