10 - discretizacao - fenix.tecnico.ulisboa.pt · leic cg algoritmo da scan line coerência de...

45
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. 7 Apontamentos CG

Upload: lamhanh

Post on 11-Oct-2018

212 views

Category:

Documents


0 download

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

LEICCG

Discretização

© 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

LEIC CG

10 2 4 6 8 0

2

4

6

8

10

14

0

12 Y span

tri. esquerdospan tri. direito14 -

13 -12 6-611 5-510 5-5 -9 4-5 6-88 3-4 6-77 3-4 6-76 2-4 6-65 1-4 6-64 5-53 -2 -1 4-4

Fragmentação

© 2011 Corpo docente de Computação Gráfica / CG&M / DEI / IST / UTL