Desafio 5
FUNDAMENTOS DA COMPUTAÇÃO GRÁFICA
ALUNO: THIAGO RIBEIRO DA MOTTA
MATRÍCULA: 1512348
PERÍODO: 2015.1
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
5
13
10
9
Tc (Tabela de Corner) =
0
{ {0, 1}, {1, 2}, {2, 0}, {3, 4}, {4, 5}, {5, 3},
0
{6, 7}, {7, 8}, {8, 6}, {9, 10}, {10, 11}, {11, 9},
{12, 13}, {13, 14}, {14, 12}, {15, 16}, {16, 17}, {17, 15} }
11
6 14
17
12 1 1
16 8 3
2 2
5
Aresta
Tv (Tabela de Vértices) =
{ {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1},
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
{3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0},
7 4
4
0, 5, 1,
{1, 5}, {5, 6}, {6, 1}, {3, 1}, {1, 6}, {6, 3} }
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
5
13
10
9
Implementado
como um dicionário { {0, 1}, {1, 2}, {2, 0}, {3, 4}, {4, 5}, {5, 3},
com pesquisa por
{6, 7}, {7, 8}, {8, 6}, {9, 10}, {10, 11}, {11, 9},
Aresta ( in = Aresta,
out = Indice)
{12, 13}, {13, 14}, {14, 12}, {15, 16}, {16, 17}, {17, 15} }
0
11
12 1 1
16 8 3
6 14
17
Tc (Tabela de Corner) =
0
2 2
5
Aresta
Tv (Tabela de Vértices) =
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
7 4
4
Implementado como
{ {0, 1}, {1, 2}, {2, 0}, {1, 4}, {4, 2}, {2, 1},
um dicionário com
pesquisa por Indice {3, 4}, {4, 1}, {1, 3}, {0, 5}, {5, 1}, {1, 0},
(in = Indice, out =
{1, 5}, {5, 6}, {6, 1}, {3, 1}, {1, 6}, {6, 3} }
aresta)
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
5
13
10
9
Para cada corner c
0
◦ Se visitado[c] for false
0
◦ n = Next(c)
◦ n1 = Next(n)
◦ eVolta = Tv[ V[n1], V[n] ]
11
12 1 1
16 8 3
6 14
17
◦ Se eVolta for null
2 2
5
◦ O[c] = -1
◦ Visitado[c] = true
◦ Senão
◦ m = Tc[eVolta].y
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
◦ p = Next(m)
7 4
◦ Se V[c] != V[p] ou V[n] != V[m]
4
0, 5, 1,
◦ O[c] = p
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
◦ O[p] = c
◦ Visitado[c] = true
◦ Visitado[p] = true
1. Opposite Table
5
13
10
9
0
15
Execução
0
◦ Se visitado[c] for false
c = 0 n = 1 n1 = 2
V[n1] = V[2] = 2
V[n] = V[1] = 1
2 2 eVolta = Tv[2,1] = 5
11
12 1 1
16 8 3
6 14
17
Para cada corner c
5
Tv (Tabela de Vértices) =
{ {0, 1}, {1, 2}, {2, 0}, {1, 4},
{4, 2}, {2, 1}, ...
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
7 4
◦ 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]
4
0, 5, 1,
◦ n = Next(c)
◦ O[c] = p
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
◦ O[p] = c
◦ Visitado[c] = true
◦ Visitado[p] = true
1. Opposite Table
5
13
10
9
0
15
Execução
0
◦ Se visitado[c] for false
eVolta = 5
m = Tc[5].y
m = {5,3}.y = 3
2 2 p=4
11
12 1 1
16 8 3
6 14
17
Para cada corner c
5
Tc (Tabela de Corner) =
{ {0, 1}, {1, 2}, {2, 0}, {3, 4},
{4, 5}, {5, 3}, ...
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
7 4
◦ 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]
4
0, 5, 1,
◦ n = Next(c)
◦ O[c] = p
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
◦ O[p] = c
◦ Visitado[c] = true
◦ Visitado[p] = true
1. Opposite Table
5
13
10
9
0
Execução
0
◦ Se visitado[c] for false
p=4
O[0] = 4
O[4] = 0
2 2 Visitado[0] = true
5
Visitado[4] = true
11
12 1 1
16 8 3
6 14
17
Para cada corner c
◦ 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
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
◦ p = Next(m)
7 4
◦ Se V[c] != V[p] ou V[n] != V[m]
4
0, 5, 1,
◦ O[c] = p
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
◦ O[p] = c
◦ Visitado[c] = true
◦ Visitado[p] = true
1. Opposite Table
5
13
10
9
0
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
Execução
0
11
12 1 1
16 8 3
6 14
17
7 4
4
Para cada corner c
◦ Se visitado[c] for false
c = 1 n = 2 n1 = 0
V[n1] = V[0] = 0
V[n] = V[2] = 2
2 2 eVolta = Tv[0,2] = null
5
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} }
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
◦ 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
1. Opposite Table
5
13
10
9
0
15
Execução
0
◦ Se visitado[c] for false
c = 1 n = 2 n1 = 0
V[n1] = V[0] = 0
V[n] = V[2] = 2
2 2 eVolta = Tv[0,2] = null
11
12 1 1
16 8 3
6 14
17
Para cada corner c
5
Não existe uma aresta que
comece no Vértice 0 e vá
para o Vértice 2.
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
7 4
◦ 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]
4
0, 5, 1,
◦ n = Next(c)
◦ O[c] = p
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
◦ O[p] = c
◦ Visitado[c] = true
◦ Visitado[p] = true
1. Opposite Table
5
13
10
9
0
Execução
0
◦ Se visitado[c] for false
eVolta = null
O[1] = -1
Visitado[1] = true
11
12 1 1
16 8 3
6 14
17
Para cada corner c
2 2
5
◦ 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
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
◦ p = Next(m)
7 4
◦ Se V[c] != V[p] ou V[n] != V[m]
4
0, 5, 1,
◦ O[c] = p
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
◦ O[p] = c
◦ Visitado[c] = true
◦ Visitado[p] = true
2. Compact Half-Edge (CHE) Table
5
13
10
9
Para cada corner c
0
◦ Se visitado[c] for false
0
◦ n = Next(c)
◦ n1 = Next(n)
◦ eVolta = Tv[ V[n1], V[n] ]
11
12 1 1
16 8 3
6 14
17
◦ Se eVolta for null
2 2
5
◦ O[c] = -1
◦ Visitado[c] = true
◦ Senão
◦ m = Tc[eVolta].x
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
◦ O[c] = m
7 4
◦ O[m] = c
4
0, 5, 1,
◦ Visitado[c] = true
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
◦ Visitado[m] = true
2. Compact Half-Edge (CHE) Table
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
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
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
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
5
13
10
9
0
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
Execução
0
◦ Se visitado[c] for false
c=0 n=1
V[n1] = V[1] = 1
V[n] = V[0] = 0
2 2 eVolta = Tv[1,0] = 11
11
12 1 1
16 8 3
6 14
17
Para cada corner c
5
7 4
◦ eVolta = Tv[ V[n], V[c] ]
◦ Se eVolta for null
◦ O[c] = -1
◦ Visitado[c] = true
◦ Senão
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}, ...
4
0, 5, 1,
◦ n = Next(c)
◦ m = Tc[eVolta].x
◦ O[c] = m
◦ O[m] = c
◦ Visitado[c] = true
◦ Visitado[m] = true
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
5
13
10
9
0
Para cada corner c
Execução
0
◦ Se visitado[c] for false
eVolta = 11
m = Tc[11].x = 11
11
12 1 1
16 8 3
6 14
17
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
4
0, 5, 1,
◦ eVolta = Tv[ V[n], V[c] ]
◦ Se eVolta for null
◦ O[c] = -1
2 2
5
7 4
◦ n = Next(c)
◦ Visitado[c] = true
◦ Senão
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}, ◦
...
◦
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
m = Tc[eVolta].x
O[c] = m
O[m] = c
Visitado[c] = true
Visitado[m] = true
2. Compact Half-Edge (CHE) Table
5
13
10
9
0
Execução
0
◦ Se visitado[c] for false
eVolta = 11
m = Tc[11].x = 11
O[0] = 11
2 2 O[11] = 0
5
Visitado[0] = true
Visitado[11] = true
11
12 1 1
16 8 3
6 14
17
Para cada corner c
◦ 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
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
◦ O[m] = c
7 4
◦ Visitado[c] = true
4
0, 5, 1,
◦ Visitado[m] = true
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
5
13
10
9
0
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
Execução
0
11
12 1 1
16 8 3
6 14
17
7 4
4
Para cada corner c
◦ Se visitado[c] for false
c=2 n=0
V[n1] = V[0] = 0
V[n] = V[2] = 2
2 2 eVolta = Tv[0,2] = null
5
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} }
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
◦ 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
Pulei o exemplo
de c = 1 por ser
análogo ao
exemplo de c = 0
2. Compact Half-Edge (CHE) Table
5
13
10
9
0
15
Execução
0
◦ Se visitado[c] for false
c=2 n=0
V[n1] = V[0] = 0
V[n] = V[2] = 2
2 2 eVolta = Tv[0,2] = null
11
12 1 1
16 8 3
6 14
17
Para cada corner c
5
Não existe uma aresta que
comece no Vértice 0 e vá
para o Vértice 2.
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
7 4
◦ 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
4
0, 5, 1,
◦ n = Next(c)
◦ Visitado[m] = true
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
5
13
10
9
0
Execução
0
◦ Se visitado[c] for false
eVolta = null
O[2] = -1
Visitado[2] = true
11
12 1 1
16 8 3
6 14
17
Para cada corner c
2 2
5
◦ 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
15
6
3
V = 0, 1, 2, 1, 4, 2, 3, 4, 1,
◦ O[m] = c
7 4
◦ Visitado[c] = true
4
0, 5, 1,
◦ Visitado[m] = true
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
Download

Desafio_5_Thiago_Rib.. - PUC-Rio