10 - discretizacao - fenix.tecnico.ulisboa.pt · leic cg algoritmo da scan line coerência de...
TRANSCRIPT
Licenciatura em Engenharia Informática e de Computadores
Computação Gráfica
Discretização
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
Edward Angel, Cap. 7Apontamentos CG
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Vértices
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
Transfs. de Modelação e Visualização
Transformação de Projecção
Divisão Perspectiva
Mapeamento Janela-Viewport
Coordenadas do Mundo
Coordenadas de Recorte
Coordenadas do Dispositivo Normalizadas
Coordenadas da Câmara
Coordenadas do
Dispositivo
Vértices
LEIC CG
Mapeamento Janela-Viewport
Divisão Perspectiva
Transformação de Projecção
����������������
� �� ��� � ∙
����������������
� �� � ∙ �� � ∙
����������������
��������������������
� �� ��� ��� �
∙
��������������������
��������������������
� ���� ����� ∙
����������������
�� ��� ��� �
�
����������!
����������!
����������!
� �� �� �
�
�
2�� � # � #
�
2$
2�� � # � #
$
2% & �
2�� � #
% # �
2
Transfs. de Modelação e Visualização
Coordenadas do Mundo
Coordenadas da Câmara
Coordenadas de Recorte
Coordenadas do Dispositivo Normalizadas
Coordenadas do Dispositivo
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Pipeline de Visualização 3D
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CGPipeline 3D
� No final do 2º andar do pipeline temos:� Primitivas
• Pontos, Linhas, Polígonos
� Já em coordenadas do viewport
� Agora…� Como desenhar essas primitivas no dispositivo?
• Rasterização
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Discretização de Pontos• Não é relevante “per se”
Discretização de segmentos de recta• Representar vectores como fragmentos
Discretização de polígonos• Preencher polígonos num espaço discreto
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
Rasterização
LEIC CGDiscretização
Milhões de execuções por cena
Necessidade de compromisso
Usar algoritmos optimizados
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Representação de Segmentocomo fragmentos
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Representação de Segmentocomo fragmentos
� Como fariam se vos pedissem para codificar?void DesenhaLinha(int x1, int y1, int x2, int y2, int color);
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEICCG
Discretização de Segmentos de Recta
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Discretização de
Segmentos de recta� Hipóteses:
� Linhas sólidas com 1 pixel de espessura
� Ignorar variação luminosidade com densidade das quadrículas
� Recta com declive contido no primeiro octante
x, y
-x, -y
y, x
-y, x
-x, y
-y, -x
y, -x
x, -y X
Y
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Discretização de Segmentos de Recta
Algoritmo Imediato
� Partir da equação da recta
y = m.x + b
� Calcular declive e coeficientes a partir dos extremos do segmento
m = (y2 - y1) / (x2 - x1)
b = y1 - m. x1
� Para x1 ≤ x ≤ x2 calcular ordenada usando equação da recta
y = Round (m . x + b) = Floor (0.5 + (m . x + b))
� Arredondar o resultado para coordenadas do pixel a desenhar
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Discretização de Segmentos de Recta
Algoritmo Imediato
Problema:
� Cada iteração requer� Multiplicação e adição virgula flutuante
� Arredondamento de real para inteiro
Alternativa:
� Usar algoritmo incremental© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Discretização de Segmentos de Recta
Algoritmo de Bresenham
� Baseado na função implícita do segmento de recta
� Calcula variável de decisão para determinar incrementos� Posição de um ponto relativamente a uma recta
• substituir coordenadas do ponto na equação e examinar o sinal
cybxayxF +⋅+⋅=),(
F(x, y) = 0
F(x, y) > 0
F(x, y) < 0
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Critério do Ponto Médio� Para escolher o próximo pixel a ”pintar”
� Calcular F(M)
� testar o sinal• (d > 0)→ NE
• (d < 0)→ E
• (d = 0)→ qualquer � Convencionou-se escolher E
� Variável de decisão d• Calculada incrementalmente
d = F (M) = F (xp + 1, yp + 1/2)
d = a (xp + 1) + b (yp + 1/2) + c
NE
E
M
PixelAnterior
Escolhas parapixel corrente
Escolhas parapixel seguinte
Q
(xp, yp)
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Cálculo Incremental de d (E)
di+1= a (xp + 2) + b (yp + 1/2) + c
= a (xp + 1) + a + b (yp + 1/2) + c
= di + a
incrE = a;
xp xp+1
M
xp+2
yp+1
yp
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Cálculo Incremental de d (NE)
di+1= a (xp + 2) + b (yp + 3/2) + c
= a (xp + 1) + a + b (yp + 1/2) + b + c
= di + a + b
incrNE = a + b;
xp
yp+1
M
xp+1 xp+2
yp
yp+2
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Valores Iniciais
� Extremos do segmento de recta em posições da grelha inteira
� Segundo pixel estudar F(M) , � com M = (x1 + 1, y1 + ½)
� Ficamos com:
F (x1, y1) = F (x2, y2) = 0
d0 = a + b/2
incr.E = a
incr.NE = a + b
F(x, y) = 0
F(x, y) > 0
F(x, y) < 0
F(x1, y1) = 0
F(x2, y2) = 0
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Código
void Bresenham(int x1, int y1, int x2, int y2, int color)
{
/* ..... algoritmo .....*/
}
� Como implementavam a inicialização?
d0 = 2. ∆∆∆∆ y - ∆∆∆∆ x
incr.E = 2. ∆∆∆∆ y
incr.NE = 2. (∆∆∆∆ y - ∆∆∆∆ x)
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Código (inicialização)
void Bresenham(int x1, int y1, int x2, int y2, int color )
{
int dx = x2 – x1; int dy = y2 – y1;
int d = 2*dy – dx2;
int incrE = 2*dy; int incrNE = 2*(dy - dx);
int x = x1; int y = y1;
WritePixel (x, y, color);
/* ..... ciclo ..... */
}
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Código (ciclo)
void Bresenham(int x1, int y1, int x2, int y2, intcolor)
{/* ..... inicializacao .....*/
while (x < x2) {
if (d <= 0) {d += incrE; x++;}
else {d += incrNE; x++; y++;
}WritePixel (x, y, color);
}
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
3 4 5 6 7 8 9 106
7
8
9
10
11
12
P1 = (5, 8) P2 = (9, 11)
x = 5 y = 8
dx = 4 dy = 3d0 = 2 incrE = 6 incrNE = - 2
d0 = 2 => NE => Write (6, 9)
d1 = 0 => E => Write (7, 9)
d2 = 6 => NE => Write (8, 10)
d3 = 4 => NE => Write (9, 11)
Write (5, 8)
Algoritmo de Bresenham
Exemplo
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
3 4 5 6 7 8 9 106
7
8
9
10
11
12
P1 = (5, 8) P2 = (10, 9)
x = ? y = ?
dx = ? dy = ?d0 = ? incrE = ? incrNE = ?
d0 = ? => ? => Write (?, ?)
d1 = .....
Write (?, ?)
Algoritmo de Bresenham
Exemplo
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo de Bresenham
Vantagem (1º Octante)
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEICCG
Preenchimento de Polígonos
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Preenchimento de polígonos
Princípios Básicos� Traçar sucessivas linhas de varrimento horizontais
� Scan line
� Calcular intersecção entre scan line e arestas� Arredondar valores para interior
� Ordenar por abcissa� x1 < x2 < x3 < x4
� Preencher cadeias de quadrículas
scan-line
Y
x1 x2 x3 x4
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo da scan line
Contabilizar Intersecções (1/2)
� Scan-line ao passar por um vértice intermédio
� contabiliza intersecção na aresta intersectada em ymin
� não na aresta intersectada em ymax
B
C1 intersecção em [AB],
0 intersecções em [BC]0 intersecções em [AB],0 intersecções em [BC]
ACA
B
C(1)
(0)
(2)
1 intersecção em [AB],1 intersecção em [BC]
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo da scan line
Contabilizar Intersecções (2/2)
� Solução anterior pode não ser suficiente
� Retirar arestas horizontais
� Não contabilizar intersecções em ymax
A B
G
D
E
C
FH
I
J
[A,B] é preenchido
[C,D] é preenchido
[H,I] não é preenchido
[F,G] não é preenchido
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Preenchimento de polígonos
Princípios Básicos� Traçar sucessivas linhas de varrimento horizontais
� Scan line
� Calcular intersecção entre scan line e arestas� Arredondar valores para interior
� Ordenar por abcissa� x1 < x2 < x3 < x4
� Preencher cadeias de quadrículas
scan-line
Y
x1 x2 x3 x4
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
� À esquerda� Arredondamento por excesso� Exemplos:
• 6,4 -> 7• 6,0 -> 6• 6,6 -> 7
� À direita� Arredondamento por defeito� Exemplos:
• 9,6 -> 9• 4,4 ->4• 6,0 -> 6
ii+1
i+3i+2
6 8 10
Algoritmo da scan line
Spans e Arredondamentos
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo da scan line
Coerência de Aresta� Arestas intersectadas por uma linha
� podem ser as intersectadas pela linha anterior
� Usando coerência de aresta:� pontos de intersecção com nova linha calculados de modo incremental
• a partir dos pontos calculados para a scan-line anterior
� Cálculo incremental apenas requer uma soma algébrica
ii+1
i+3i+2
Para cada aresta:
( ) ( )
y
x
m
bm
xm
x
yyy
yxyxx
∆∆=
−=
−=∆−=∆
1
11minmax
minmax ( ) ( )
( )m
yx
bmm
ym
bm
ym
yx
1
111
11
11
+=
−+=
−+=+
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo da scan line
Tabela de Lados (Edge Table: ET)
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo da scan line
Tabela de Lados Activos (AET)
� O algoritmo mantém uma Tabela de Lados Activos(Active Edge Table: AET)
� AET regista informação relativa aos lados intersectados pela linha actual
� arestas horizontais, colineares com a “scan-line”
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
Algoritmo da scan line
Algoritmo (1/2)
� Preencher a ET� arestas horizontais são descartadas
� Criar AET e inicializá-la vazia
� Ciclo à linha de varrimento� y entre ymin e ymax do polígono:
• Mover de ET para AET lados com � ymin = y
• Ordenar esses lados por x
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
� Preencher spans da linha corrente
• utilizando pares de coordenadas x
� relativas aos lados registados em AET
� Actualizar a AET• Remover de AET todas as arestas com ymax-1 = y
(terminam na próxima linha)
• Para as que permanecem
� incrementar x de 1/m e
• Ordenar AET por x (se for poligono auto-intersectante)
� Incrementar o valor de y de uma unidade
(ordenada da próxima scan-line)
Algoritmo da scan line
Algoritmo (1/2)
© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL
LEIC CG
7 -5/2 3 AB
4,5 -5/2 3 AB
7 6/4 - 5 BC
8,5 6/4 - 5 BC
10 6/4 - 5 BC
11,5 6/4 - 5 BC
2 0 9 FA
2 0 9 FA
2 0 9 FA
2 0 9 FA
2 0 9 FA
2 0 9 FA
13 0 - 11 CD
13 0 - 11 CD
13 0 - 11 CD
13 0 - 11 CD
7 -5/2 9 EF
4,5 -5/2 9 EF
7 6/4 11 DE
8,5 6/4 11 DE
13 0 - 11 CD
13 0 - 11 CD
11,5 6/4 11 DE
10 6/4 11 DE
1
2
3
4
5
6
7
8
9
10
11
Tabela de Arestas Activas Tabela de Arestas Y
FA, CD, EF, DE
vazia
FA, CD, EF, DE
CD, EF, DE
CD, EF, DE
EF, DE
EF, DE
vazia
vazia
vazia
vazia
vazia
Algoritmo da scan line
Exemplo