Académique Documents
Professionnel Documents
Culture Documents
• Estudar
– equipamentos, técnicas de programação e
conceitos matemáticos
• Para
– representação, manipulação e projeção de
objetos bi- e tridimensionais
– aplicar a problemas específicos
2
Sumário do Curso
6
7.2 Ponto ...
• Especificar
– coordenadas (x, y)
– intensidade
– Obs: em sistemas preto e branco
especificar apenas (x,y)
– setPixel(x,y)
• Desenho de Ponto
– GKS
• set_marker_type (int type)
• polymarker (int num_points, WCPT *pts)
7
... Ponto ...
• Desenho de Ponto
– Phigs:
• set_polymarker_type (type)
– Type = 1: single pixel
– Type = 2: +
– Type = 3: *
– Type = 4: o
– Type = 5: x
• polymarker (int num, float x, float y)
8
... Ponto
• Desenho de Ponto
– OpenGL:
glBegin(GL_POINTS);
glVertex2i(int x, int y)
glEnd();
9
7.3 Segmentos de Reta e
Polígonos ...
• Definir extremidades (x1, y1) e (x2, y2)
y2
Δy
y1
Δx
x1 x2
10
... Segmentos de Reta e
Polígonos ...
• Algoritmo DDA (Digital Differential
Analyzer) ...
– Atribui incrementos unitários a uma
coordenada
– Calcula o valor da outra coordenada
Se |m| < 1 e x2 > x1 Se |1/m| < 1 e y2 > y1
xi+1 = xi + 1 xi+1 = xi + 1/m
yi+1 = yi + m yi+1 = yi + 1
Se |m| < 1 e x2 < x1 Se |1/m| < 1 e y2 < y1
xi+1 = xi – 1 xi+1 = xi – 1/m
yi+1 = yi – m yi+1 = yi – 1
11
... Segmentos de Reta e
Polígonos ...
< 45o
12
... Algoritmo DDA ...
procedure dda (x1, y1, x2, y2 : integer);
var
dx, dy, steps, k : integer;
x_increment, y_increment, x, y : real;
begin
dx := x2 - x1;
dy := y2 - y1;
if abs(dx) > abs(dy) then steps := abs(dx)
else steps := abs(dy);
x_increment := dx / steps;
y_increment := dy / steps; 13
... Algoritmo DDA ...
x := x1; y := y1;
setPixel (round(x), round(y));
for k := 1 to steps do begin
x := x + x_increment;
y := y + y_increment;
setPixel (round(x), round(y));
end {for k}
end; {dda}
14
... Algoritmo DDA ...
void dda (int x1, int y1, int x2, int y2)
{
int dx, dy, steps, k;
float x_increment, y_increment, x, y;
dx = x2 - x1;
dy = y2 - y1;
if (abs(dx) > abs(dy) ) steps = abs(dx);
else steps = abs(dy);
x_increment = dx / steps;
y_increment = dy / steps;
15
... Algoritmo DDA ...
x = x1;
y = y1;
setPixel (floor(x+0.5), floor(y+0.5));
for (k = 0; k < steps; k++)
{ x += x_increment;
y += y_increment;
setPixel (floor(x+0.5), floor(y+0.5));
}
} // fim do dda
16
... Segmentos de Reta e
Polígonos ...
• Sistema vetorial
– Gerador analógico de vetores gera linha
• Voltagem de deflexão horizontal proporcional a
Δx
• Voltagem de deflexão vertical proporcional a Δy
• Sistema raster
– Algoritmo de Bresenham
• Determina pontos da matriz próximos à linha
17
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Método bastante veloz
• Utiliza somente aritmética inteira
• Evita operações caras em ponto
flutuante
– multiplicação
– divisão
• Evita operações de arredondamento
18
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Considere inclinação 0 < m ≤ 1:
– Considere pixel (xi , yi ) sobre a linha
– Se m < 1, próximo pixel mais próximo à
linha será (xi + 1, yi ) ou (xi+1 , yi + 1)
y=mx+b
xi xi+1
19
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Processo de decisão
se (d1 – d2) < 0 => selecionar yi
se (d1 – d2) ≥ 0 => selecionar yi+1≡ yi+1
onde
(d1 – d2) = (y - yi) - (yi + 1 - y)
yi+1 = 2y - 2 yi - 1
= 2 [ m (xi + 1) + b ] - 2yi - 1
y d2
= 2 [ (Δy/Δx) (xi + 1) + b ] - 2yi - 1
yi d1
xi+1
20
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Parâmetro de decisão
pi = Δx (d1 – d2 ) < 0, selecionar yi
≥
0, selecionar yi + 1
onde
pi = 2 Δy xi - 2 Δx yi + [ 2 Δy + Δx (2b - 1)]
p0 = 2 Δy x0 - 2 Δx [(Δy/Δx) x0+ b] +
[2Δy + Δx (2b - 1)]
p0 = 2 Δy - Δx
Reduzir operações, obtendo pi+1 a partir de pi
21
... Algoritmo de Bresenham
para Traçado de Linhas ...
pi = 2 Δy xi - 2 Δx yi + [ 2 Δy + Δx (2b - 1)]
pi+1= 2 Δy xi+1 - 2 Δx yi+1 + [ 2 Δy + Δx (2b -
1)]
pi+1- pi= 2 Δy(xi+1- xi) - 2 Δx(yi+1- yi)
pi+1= pi + 2 Δy(xi+1- xi) - 2 Δx(yi+1- yi)
22
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Parâmetro de decisão incremental
pi+1= pi + 2 Δy - 2 Δx(yi+1- yi)
yi+1
pi+1= pi + 2 Δy y d2
yi d1
xi+i
23
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Parâmetro de decisão incremental
pi+1= pi + 2 Δy - 2 Δx(yi+1- yi)
25
... Algoritmo de Bresenham
para Traçado de Linhas ...
• Simetria generaliza o algoritmo para os
demais quadrantes
y→y+1
x→x–1 x→x+1
y→y–1
26
... Algoritmo de Bresenham
para Traçado de Linhas ...
X = Xstart ; Y = Ystart
dX = Xend – Xstart; dY = Yend – Ystart
27
... Algoritmo de Bresenham
para Traçado de Linhas ...
Se dX > dY // |m| < 1 (incrementa x, decide y)
Então
P = 2dY – dX
Para K = 0 até dX Faça
setPixel(X, Y)
Se P > 0 Então
Y = Y + Yincr
P = P – 2dX
Fim do Se
X = X + Xincr
P = P + 2dY
Fim do Para
Fim do Então 28
... Algoritmo de Bresenham
para Traçado de Linhas ...
Senão // |m| ≥ 1 (incrementa y e decide x)
P = 2dX – dY
Para K = 0 até dY Faça
setPixel(X, Y)
Se P > 0 Então
X = X + Xincr
P = P – 2dY
Fim do Se
Y = Y + Yincr
P = P + 2dX
Fim do Para
Fim do Senão
29
Exemplo: Algoritmo de
Bresenham
Pstart =(25, 15), Pend =(30, 5), m = - 2, dx > 0, dy < 0
15
10
25 30 30
Traçado de Polígonos
31
Armazenamento de
Intensidades de Pixels …
• Armazenamento por linhas num
sistema preto e branco
ymax
0 x xmax
33
Antialiasing de Linhas …
0 x xmax 34
… Antialiasing de Linhas …
35
… Antialiasing de Linhas …
36
… Antialiasing de Linhas …
37
… Antialiasing de Linhas …
38
Comandos para traçado de
linhas…
• GKS
polyline (n, x, y)
• n = 1 -> Um único ponto
• n -> n-1 segmentos de linha conectados
– Implementação
• Múltiplas chamadas ao algoritmo de traçado de
linhas
– Permite exibir pontos, eixos coordenados,
figuras geométricas, etc. com uma única
declaração
– Especifica os elementos dos vetores x e y
como coordenadas absolutas
39
… Comandos para traçado de
linha
• PHIGS
polyline (n, x, y)
• OpenGL
– glBegin ( GL_LINE_STRIP) ;
• glVertex2i (x1, y1) ;
• glVertex2i (x2, y2) ;
• glVertex2i (x3, y3) ;
– glEnd( ) ;
40
7.4 Círculos …
• Cálculo de pontos ao longo da curva
2 2 2 2 2
(x − xc) + ( y − yc) = r ou y = yc ± r − ( x − xc)
• Aritmética de ponto flutuante
– consome bastante tempo
€ – provoca falhas na curva
• Cálculos na forma paramétrica evitam falhas
x = xc + r cos θ
y = yc + r sen θ
• Computação ainda em ponto flutuante
41
… Círculos
• Simetria Circular
– Calcular coordenadas de 1/8 da
circunferência
(-x, y) (x, y) y=x
– Obter demais pontos
por simetria
(-y, x) (y, x)
yc yc
xc xc
43
Algoritmo do Ponto Médio
para Círculos …
• Parâmetro de decisão é f(x, y)
f(x, y) = x2 + y2 - r2
– Se
f(x, y) = 0, (x, y) está sobre a circunferência
f(x, y) < 0, (x, y) é interior à circunferência
f(x, y) > 0, (x, y) é exterior à circunferência
yk
yk+1
xk xk+1 x2 + y2 = r2
44
… Algoritmo do Ponto Médio
para Círculos …
• Posição do próximo pixel depende do sinal de
pk = f(xk + 1, yk - 1/2)
= (xk + 1)2 + (yk - 1/2)2 - r2
• Parâmetro de decisão incremental
pk+1 = f(xk+1 + 1, yk+1 - 1/2), com
xk+1 = xk + 1
yk
yk+1
xk xk+1 x2 + y2 = r2
45
… Algoritmo do Ponto Médio
para Círculos
• Dois casos possíveis:
1. Se pk < 0, yk+1 = yk {circunferência passa
entre ponto médio e pixel superior}
pk+1= (xk+ 1)2 + 2(xk+1)+1 + (yk - ½ )2 - r2
pk+1= pk + 2(xk + 1) + 1 = pk + 2 xk+1 + 1
2. Se pk ≥ 0, yk+1 = yk - 1
pk+1= (xk+ 1)2 + 2(xk+ 1)+1+ (yk - ½ )2
- 2(yk - ½ ) + 1 - r2
pk+1 = pk + 2 xk+1 - 2 yk+1 + 1
46
… Algoritmo do Ponto Médio
para Círculos
1
• No ponto inicial (0,r ) = 0, floor r +
2
2
p0 = f (1,r −1 2) = 1 + ( r −1 2) − r 2
2
2 2 1 2 2 5
= r −r −€ r + +1= r − r − r +
4 4
5 > 0, se r = 1
Quando r for inteiro : r = r → p0 = − r →
4 < 0, se r > 1
47
… Resumo do Algoritmo
1. Desenhar o primeiro ponto: (x0, y0) = (0, r)
2. Calcular o valor do parâmetro inicial, p0
3. A cada passo sucessivo
Se pk < 0, próximo ponto = (xk + 1, yk )
pk+1 = pk + 2 xk+1 + 1
Senão, próximo ponto = (xk + 1, yk - 1)
pk+1 = pk + 2 xk+1 - 2 yk+1 + 1
4. Para círculos centrados em (xc, yc),
translada-se: x = x + xc e y = y + yc
5. Determinam-se pontos nos outros octantes
48
Exemplo: Algoritmo do Ponto
Médio para Círculos
r = 10, p0 =
pk+1 = pk + 2 xk+1 + 1 (-2 yk+1 se pk > 0)
10
0
0 5 10 49
Elipses …
50
… Algoritmo do Ponto Médio
para Elipses …
região 1
ry
Inclinação = -1
rx
região 2
• Parâmetro de decisão:
f(x, y) = ry2 x2 + rx2 y2 - rx2ry2
• Primeiro quadrante
– Dois parâmetros de decisão
• Região 1: (0, ry) até (x, y) | dy / dx ≥ -1
• Região 2: (x, y) | dy / dx < -1 até (rx, 0)
51
… Algoritmo do Ponto Médio
para Elipses …
• Região 1: incrementar em x de (0, ry)
até dy/dx = -1 ⇒ ry2 x = rx2 y
– ponto corrente: (xk, yk)
– ponto médio: (xk + 1, yk - 1/2)
– próximo ponto:
região 1
(xk + 1, yk) ou (xk + 1 , yk - 1)
ry
rx
52
… Algoritmo do Ponto Médio
para Elipses …
• Região 2: incrementar em y
do último ponto da região 1 até (rx, 0)
– ponto corrente: (xk, yk)
– ponto médio: (xk + 1/2, yk - 1)
– próximo ponto:
(xk, yk- 1) ou (xk+ 1, yk- 1)
ry
rx
região 2
53
… Algoritmo do Ponto Médio
para Elipses
• Algoritmos para arcos
– derivados dos algoritmos para
• círculo
• elipse
– dados
• coordenadas das extremidades ou
• ângulos
54
… Algoritmo do Ponto Médio
para curvas
• O método pode ser aplicado a outras
funções da forma: f(x, y) = 0
– Cônicas
Ax2 + By2 + Cxy + Dx + Ey + F = 0
– Polinômios
(Σ ak x k) - y = 0, k=0, 1, ..., n
• Aproximação paramétrica é geralmente
– mais eficiente e
– mais flexível
55
GKS : Primitivas Generalizadas
de Desenho…
• Função geral para traçado de curvas
geralized_drawing_primitive (n, x, y, id, na, a)
n = número de pontos básicos na definição da
primitiva
x, y = arrays de coordenadas
id = identificação da primitiva
a = array de dados não coordenadas
na= número de elementos na matriz a
• Disponibiliza a interface para
implementações em hardware de
primitivas
56
… GKS : Primitivas
Generalizadas de Desenho
• Exemplo
geralized_drawing_primitive (n, x, y, id, na, a)
• Traçado de círculos
– n = 1
– (x(1), y(1)) = (xc , yc)
– a(1) = r
– na = 1
• Traçado de arcos circulares
– n = 1
– (x(1), y(1)) = (xc , yc)
– a(1) = r, a(2) = ângulo inicial, a(3) = ângulo final
– na = 3 57
Exibição de Caracteres…
• Sistemas raster
– Caracteres
• Definido como uma grade retangular de
valores de intensidade (0 e 1 para
sistemas de dois níveis)
• Copiar a grade para o raster nas
posições especificadas
58
… Exibição de Caracteres
• OpenGL
– Define array de bytes com forma desejada
Glubyte <n_arr_bytes>[n_bytes] =
{byte1, byte2, ..., byte_n_bytes };
– Canto inf. esquerdo da área de bits (w x h)
glRasterPos2i (x, y);
– Copia array de bytes na posição (xb0, yb0)
da área de bits w x h
glBitmap(w, h, xb0, yb0, xbi, ybi,
n_arr_bytes);
59
… Estilos de Linha
• OpenGL: funções de atribuição de estilo para
linhas
glEnable(GL_LINE_STIPPLE);
glLineStipple (factor, pattern);
– pattern é uma série de 16 bits formando o padrão
da linha (Glushort)
– factor é um de amplificação das seqüências de bits
(Glint)
glLineWidth(width);
– width = largura em pixels (Glfloat)
• implementação modifica algoritmos de
traçado
60
7.8 Métodos de
Preenchimento de Regiões
• Preenchem regiões fechadas com cor
ou padrão
• Dois métodos gerais
– Método 1 identifica em cada scan-line os
pontos que estão no interior da região
– Método 2 “Pinta”, a partir de um ponto
interior, seus pontos vizinhos até atingir as
bordas da região (inundação)
61
... Métodos de Preenchimento
de Regiões ...
• Método 1 – Scan-line
v
a
r
r
e Scan-line
d
u
r
a
62
... Métodos de Preenchimento
de Regiões ...
• Método 1 – Scan-line
v
a
r
r
e Scan-line
d
u
r
a
63
... Métodos de Preenchimento
de Regiões ...
• Método 2 – Inundação
A partir do
pixel
Semente
Examinar os
pixels
vizinhos
64
Algoritmo de Scan-Line …
Linha Inferior
65
… Algoritmo de Scan-line …
66
… Algoritmo de Scan-line …
Preenchimento de Retângulos
• Região limitada por
– duas linhas horizontais ymin e ymax
– duas linhas verticais xmin e xmax
ymax
• Algoritmo
para ymin < y < ymax faça
para xmin < x < xmax faça ymin
xmin xmax
EscrevaPixel (x, y, valor)
fim_para
fim_para
67
… Algoritmo de Scan-line …
• Polígonos Côncavos
68
… Algoritmo de Scan-line …
... Preenchimento de Polígonos Gerais
• Desejável pintar pixels que estejam
estritamente dentro do polígono
• Algoritmo de
traçado de linha não
conhece região
interior ou exterior
• Polígono vizinho
pode ser invadido
com cor diferente
69
… Algoritmo de Scan-line …
71
… Algoritmo de Scan-line …
.
1 ponto .
2 pontos .1 ponto = 4 pontos
73
… Algoritmo de Scan-line …
0 interseção
74
… Algoritmo de Scan-line …
Scan line
75
… Algoritmo de Scan-line …
1 2 3 4 6 7 8
1 2 3 4 5 6 7 8 76
… Algoritmo de Scan-line …
77
… Algoritmo de Scan-line …
78
… Algoritmo de Scan-line …
• Scanline aponta
para lista das
arestas que se
tornam ativas
– AB e BC tornam-se
ativas na scanline 1
– Nenhuma aresta
torna-se ativa na
scanline 2
79
… Algoritmo de Scan-line …
• Para cada scanline uma Tabela (Lista) de
Arestas Ativas (AET) é construída
– Aresta incluída se ymin igual yscanline
– Aresta excluída se ymax igual yscanline
80
… Algoritmo de Scan-line …
Métodos de Coerência
• Pixels adjacentes têm propriedades similares
– determinar propriedades de um pixel a partir de
pixels previamente processados (propriedades
coerentes)
• Ao longo de uma scan-line, as intensidades
de pixels podem ser constantes, linearmente
variáveis, etc.
• Métodos de coerência podem ser utilizados
para calcular interseções da próxima scan-
line com um lado do polígono a partir da
interseção do mesmo com a scan-line
anterior 81
… Algoritmo de Scan-line …
(xk, yk)
Scan-line Corrente
Próxima Scan-line
(xk+1, yk+1)
• Métodos de Coerência
Inclinação da aresta de um polígono
m = (yfin - yin) / (xfin - xin)
E o próximo ponto de interseção tem as
coordenadas:
yk+1 = yk - 1
xk+1 = xk - 1/m
Para se evitar acúmulo de erro de
arredondamento xk = x0 - k/m
82
Preenchimento com Padrões
Retangulares
• Preencher com um padrão pré-
determinado através da superposição
da definição de um padrão retangular
em uma linha.
• Partindo-se de um ponto selecionado
3
2
1
0
012 3
83
... Métodos de Preenchimento
de Regiões ...
x= 7
84
Preenchimento de Áreas com
Antialiasing
• Idéia similar àquela para linhas
– Ajusta-se a intensidade dos pixels
próximos da borda de acordo com a
porcentagem de área coberta:
85
Preenchimento de Áreas com
Antialiasing
• Áreas de Pixels Subdivididas
Equivalente a adicionar scan-lines
extras.
PIXEL
3 subdivisões estão no interior (3/4 da área do pixel)
intensidade do pixel é igual a 0,75 do máximo
86
Algoritmo de Pitteway-
Watkinson
• Algoritmo do ponto médio para linhas
• Considere o lado de um polígono com
inclinação
– 0 < m ≤ 1, passando pelo ponto ( xk, yk )
yk+1 y=mx+b
yk+1/2
yk
Em x = xk + 1 xk xk+1
pk = y - (yk+0.5) = m(xk+1) + b - (yk+0.5)
(< 0: selecionar yk; > 0: selecionar yk + 1)
87
… Algoritmo de Pitteway-
Watkinson …
Yk
Y=m(Xk-0.5) + b Y=m(Xk+0.5) + b
Xk-0.5 Xk+0.5
Xk
88
… Algoritmo de Pitteway-
Watkinson …
• Parâmetro de decisão:
Pk = y - (yk + 0.5) = m(xk + 1) + b - (yk + 0.5)
= [m xk + b - (yk - 0.5)] + (m -1)
= [área interna do pixel (xk, yk)] + (m - 1)
• Definindo o parâmetro p’k no intervalo de 0 a
1 como
p’k= pk + (1 - m) = [área interna do pixel (xk,
yk)]
– se pk < 0 ==> p’k < ( 1 - m ) : selecionar yk
– se pk > 0 ==> p’k > ( 1 - m ) : selecionar yk+1
89
… Algoritmo de Pitteway-
Watkinson …
• Método incremental para cálculo de p’k
sucessivos:
– Partindo-se do extremo (x0, y0):
– p’o = [ m xo + b - (yo - 0.5 )] = yo - yo + 0.5 = 0.5
Temos:
– p’k+1 = p’k + m - ( yk+1 - yk )
• Para grandes inclinações, |m| > 1, a
porcentagem de cobertura do pixel em (xk,
yk) é calculada como:
• pk = xk - ( yk / m ) + [ ( b / m ) + 0.5 ]
90
… Algoritmo de Pitteway-
Watkinson
• É um método preciso e rápido para o ajuste
da intensidade do pixel quando somente um
lado do polígono passa pela área de um pixel
• Para polígonos “estreitos”, utilizar o método
da subdivisão :
91
Algoritmo de Scan-line
92
Algoritmo de Boundary-fill
• Entrada:
– Coordenada (x, y) de um ponto interior
– Cor de preenchimento
– Cor da fronteira
• Processo:
– A partir do ponto (x, y) verificar se os pixels
vizinhos têm cores diferentes da cor da fronteira
– se a cor do pixel for diferente, pintar com cor de
preenchimento.
– parar quando não conseguir mais pintar
• Útil em programas de pintura e entrada
interativa
93
Áreas de Conexão-4
(x, y)
94
Áreas de Conexão-8
(x, y)
20
20 x 20 grid
15 Seed (13, 12)
xmax=17
10 xmin= 11
1
1 5 10 15 20
98
Algoritmo de Boundary-fill
20
Linha 13
15 Faixa [11,17]
Empilhar(16,13)
10
Linha 11
Faixa [11,17]
Empilhar(17,11)
5
1
1 5 10 15 20
99
Algoritmo Recursivo
procedure flood_fill ( x, y, fill_col, subst_col :
integer );
var curr_col : integer;
begin
curr_col := inquire_color ( x, y );
if (curr_col = subst_col) then begin
set_pixel ( x, y, fill_col);
flood_fill ( x + 1, y , fill_col, subst _col);
flood_fill ( x - 1, y , fill_col, subst _col);
flood_fill ( x , y + 1, fill_col, subst _col);
flood_fill ( x , y - 1, fill_col, subst _col);
end { if curr_col }
end; {bound_fill }
100
Funções para Preenchimento
de Áreas
• Permite que uma área poligonal
fechada seja preenchida com uma
determinada cor ou padrão
• A implementação desta função depende
do tipo de atributo de preenchimento
• Preenchimento vazio ≡ polyline com o
último ponto conectado ao primeiro
ponto
101
Funções para Preenchimento
de Áreas
• OpenGL
// Draw a filled polygon
glPolygonMode(GL_FRONT, GL_FILL);
glBegin(GL_POLYGON);
glVertex2i(10,10);
glVertex2i(20,10);
glVertex2i(25,20);
glVertex2i(10,20);
glEnd();
102
Funções de Preenchimento de
Áreas do OpenGL
• Habilitar preenchimento com padrões
glEnable ( GL_POLYGON_STIPPLE )
• Estabelecer um padrão
glPolygonStipple ( mask )
mask= ponteiro para um padrão de 32 x 32 bits
armazenado na memória
• Modo de preenchimento
glPolygonMode( face, mode )
face = GL_FRONT, GL_BACK,GL_FRONT_AND_BACK
mode = GL_FILL
103
3.2 Transformações de
Visualização
• Sistemas de Coordenadas
– Coordenadas do mundo (world-coordinates)
• utilizadas para definir a cena no mundo real
• Geralmente utiliza números reais (ponto flutuante)
– Coordenadas do dispositivo (device-
coordinates)
• coordenadas próprias do dispositivo de saída onde a
cena será exposta
• Utiliza números inteiros
• Mapeamento da cena de WC para DC
104
Sistemas de Coordenadas
5.000 km
852
6.000 km 1.023
World-Coordinates Device-Coordinates
105
Janela, “Viewport” e “Aspect
Ratio”
• Janela: sub-região da cena a ser
exibida y_wc P2
– Retangular
P1 = ( xw_min, yw_min )
P2 = ( xw_max, yw_max ) P1
x_wc
– Circular y_wc
C = ( x_c, y_c ) R
R = ( raio )
C
106
x_wc
Janela na cidade do Rio de
Janeiro
(5.300, 1.400) km
P’2
P’1 = ( xv_min, yv_min)
P’2 = ( xv_max, yv_max)
P’1
x_dv 108
Viewports
112
Janela, “Viewport” e “Aspect
Ratio”
• Aspect Ratio: razão entre
– dimensões x e y da janela
– dimensões x e y da viewport
– Se aw ≠ av → ocorre distorção
113
Clipping e Shielding
• Após definição das janelas e das viewports
– operações necessárias à visualização
• Clipping
• Shielding
• Transformações de coordenadas
• Clipping:
– Apaga todas as partes da cena que estejam fora
da janela
– Executado antes ou depois da transformação de
coordenadas.
• Shielding:
– Apaga todas as partes da cena que estejam dentro
da janela
114
Clipping
• Tipos de Clipping
– Clipping de Janela
– Clipping de Viewport
• Clipping de Janela
– Exclui primitivas externas à janela das
transformações de visualização (reduz a
transformação de coordenadas)
– Requer operações de ponto flutuante para
localizar interseções com a janela
– há clippers rápidos desenvolvidos em
hardware)
115
Clipping
• Clipping de Viewport
– Operações de clipping realizadas em
coordenadas de dispositivo (inteiras)
– Reduz cálculos utilizando-se de
concatenação das matrizes de
transformação de visualização com
matrizes de transformação geométricas
– Requer que os objetos externos à janela
sejam transformados para coordenadas
de dispositivo
116
Clipping
117
Clipping de Ponto
– O ponto P = (x, y) será exibido se:
xw_min ≤ x ≤ xw_max
yw_min ≤ y ≤ yw_max
yw_max
yw_min
xw_min xw_max
118
Clipping de linha
• Casos possíveis:
– Linha completamente dentro da janela
– Linha completamente fora da janela
– Linha traspassa uma borda da janela
119
Clipping de linha
120
Clipping de Linha
• Algoritmo de Cohen-Sutherland
– Identifica rapidamente linhas internas e
externas
– utiliza código de região com quatro bits
para os pontos extremos da linha.
códigos de região
3 2 1 0 Posição do Bit
122
Clipping de Linha (Cohen-
Sutherland)
• código de região obtidos comparando-
se as coordenadas (x, y) do ponto com
as coordenadas das bordas da janela
yw_max
yw_min
xw_min xw_max
123
Clipping de Linha
• Algoritmo de Cohen-Sutherland
– bit 0 =1 se x < xwmin
– bit 1 =1 se xwmax < x
– bit 2 =1 se y < ywmin
– bit 3 =1 se ywmax < y
• Podemos calcular os valores dos bits como
– bit 0 = sign bit de (x - xwmin)
– bit 1 = sign bit de (xwmax - x )
– bit 2 = sign bit de (y - ywmin)
– bit 3 = sign bit de (ywmax - y )
124
Clipping de Linha
• Algoritmo de Cohen-Sutherland
– Definir códigos C1 e C2 para extremidades das
linhas
– Se (C1 | C2) == 0000 → linha interna
(todos os bits em C1 e C2 são iguais a 0)
– Se (C1 & C2) != 0000 → linha externa
(algum bit correspondente em C1 e C2 é igual a 1)
– Qualquer outro caso → linha pode cortar a região
• Exemplo:
– 0101 e 0110 → abaixo da janela (bit 2)
– teste com o operador lógico AND (&)
– (0101) & (0110) = 0100 ≠ 0000 ∴ fora
125
Clipping de Linha (Cohen-
Sutherland)
Linha AB que não for aceita ou rejeitada
– Verificar bits do código de A na seqüência
Esquerda → Direita → Inferior → Superior
– O primeiro bit = 1 encontrado determina a
borda com a qual deve-se calcular o ponto
de interseção I
– Descarta-se segmento AI e define-se
código para I
– Repetir testes para segmento IB
126
Clipping de Linha (Cohen-
Sutherland)
B (0010)
– Partir do extremo A
– Verificar o código de A da direita para a
esquerda
– A está acima da janela
– Calcular interseção com borda superior
127
Clipping de Linha (Cohen-
Sutherland)
– Descartar segmento AI acima da janela
I (0010)
B (0010)
≡
– Teste (CI & CB) 0010 != 0000 → IB está
completamente à direita
– Descartar IB
128
Clipping de Linha (Cohen-
Sutherland)
• Processando uma linha de intersecção:
A (1000)
B (0010)
129
Clipping de Linha (Cohen-
Sutherland)
• Iniciar em A (Código (1000)
• Primeiro bit diferente de zero é o bit 3
• Encontramos a intersecção com o topo
I1 (0000)
B (0010)
I2 (0000)
Cálculo da interseção
• coordenadas são calculadas a partir
dos valores das coordenadas do
extremo e da inclinação da linha
yw_max
P2
(x, y)
yw_min P1
xw_min xw_max
132
Clipping de Linha
133
Clipping de Linha
134
Clipping de Linha
135
Clipping de Linha
xvmin xvmax
• P1 à esquerda e P2 à direita da Viewport
• Procurar interseção à esquerda e à direita
– calcular Pm ≡ (xm, ym)
– verificar se Pm interno (xvmax > xm > xvmin)
sim → calcular meio de P1Pm e de PmP2
não
→ calcular interseção de P1Pm se Pm > xvmax
→ calcular interseção de PmP2 se Pm < xvmin
137
P1 Pm=( xm, ym )
Clipping de Linha
P2
138
Clipping de Linhas
139
Clipping de Linhas
Algoritmo de subdivisão do ponto médio
• Linha com n pixels que intercepta bordas da
viewport precisa de no máximo
b = log2n cálculos de Pm
Exemplo: n = 512 pixels
‒ → 1 pixel = 512 / ( 2 b )
‒ → 2 b = 512
‒ → b = log2 512 = 9
• Trade off:
– Requer mais cálculos, porém
– elimina multiplicação e divisão de ponto flutuante
– Obs: As divisões por 2 são simples shifts de bits
140
Clipping de Linhas
Algoritmo de Liang-Barsky ...
• Reduz os cálculos de clipping utilizando
equações paramétricas de retas:
x = x1 + u · Δx
y = y1 + u · Δy y2
0 ≤ u ≤ 1 (x,y)
y1
Δx = x2 - x1
x1 x2
Δy = y2 - y1
• Cálculo de interseções utiliza o parâmetro u
141
Clipping de Linhas
142
Clipping de Linhas
• Os parâmetros pk e qk abaixo são usados
para clipping
pk · u ≤ qk, k = 1, 2, 3, 4
• Os valores de k são relacionados às bordas da
janela:
k = 1: esquerda; p1 = - Δx ; q1 = x1 - xwmin
k = 2: direita; p2 = + Δx ; q2 = xwmax - x1
k = 3: abaixo; p3 = - Δy ; q3 = y1 - ywmin
k = 4: acima; p4 = + Δy ; q4 = ywmax - y1
143
Clipping de Linhas
• Possibilidades de pk
(1) pk = 0
→ reta horizontal ( Δy = 0 )
→ reta vertical ( Δx = 0 )
Se qk < 0 → linha fora da janela (eliminar)
Se qk ≥ 0 → linha dentro da janela
144
Clipping de Linhas
Ex 1:[p1= - Δx = 0; q1 = x1 - xwmin < 0]
xwmin
Ex 2:[p2= Δx = 0; q2 = xwmax – x1 < 0]
xwmax 145
Clipping de Linhas
Ex 3: [ p3= - Δy = 0; q3 = y1 - ywmin < 0 ]
Reta abaixo da janela
ywmax
ywmin
146
Clipping de Linhas
(2) pk < 0
• k = 1: esquerda; p1 = - Δx < 0 → Δx > 0
• k = 2: direita; p2 = + Δx < 0 → Δx < 0
• k = 3: abaixo; p3 = - Δy < 0 → Δy > 0
• k = 4: acima; p4 = + Δy < 0 → Δy < 0
x2 x1
x1 x2
147
Clipping de Linhas
(2) pk < 0
• k = 1: esquerda; p1 = - Δx < 0 → Δx > 0
• k = 2: direita; p2 = + Δx < 0 → Δx < 0
• k = 3: abaixo; p3 = - Δy < 0 → Δy > 0
• k = 4: acima; p4 = + Δy < 0 → Δy < 0
148
Clipping de Linhas
(3) pk > 0
• k = 1: esquerda; p1 = - Δx > 0 → Δx <0
• k = 2: direita; p2 = + Δx > 0 → Δx >0
• k = 3: abaixo; p3 = - Δy > 0 → Δy <0
• k = 4: acima; p4 = + Δy > 0 → Δy >0
x1 x2
x2 x1
149
Clipping de Linhas
(3) pk > 0
• k = 1: esquerda; p1 = - Δx > 0 → Δx <0
• k = 2: direita; p2 = + Δx > 0 → Δx >0
• k = 3: abaixo; p3 = - Δy > 0 → Δy <0
• k = 4: acima; p4 = + Δy > 0 → Δy >0
150
Clipping de Linhas
pk ≠ 0: interseção linha com bordas da região
u1 = q1 / p1 = ( x1 - xwmin ) / ( - (x2 - x1 ) )
u2 = q2 / p2 = ( xwmax - x1 ) / ( +(x2 - x1 ) )
u3 = q3 / p3 = ( y1 - ywmin ) / ( - (y2 - y1 ) )
u4 = q4 / p4 = ( ywmax - y1 ) / ( +(y2 - y1 ) )
(x1,y1)
xwmin 151
Clipping de Linhas
Procedimento básico:
Calcular parâmetros de entrada na região da janela
uα = max ( 0, uk ) para pk < 0
faces atravessadas ao aproximar-se da região
Calcular parâmetros de saída da região da janela
uβ = min (1, uk ) para pk > 0
faces atravessadas ao afastar-se da região
Se uα > uβ reta completamente fora da janela
Se uα < uβ pontos finais da reta são
P1 = ( x(uα), y(uα) ) e P2 = ( x(uβ), y(uβ) )
152
Clipping de Linhas
Δx > 0 e Δy > 0
(x2,y2)
k = 1: esquerda
uβ
k = 2: direita
(x1,y1) k = 3: abaixo
uα
k = 4: acima
153
Clipping de Linhas
Δx > 0 e Δy > 0
u=1 u2>1
k = 1: esquerda
uuβ
4<1
(u <1)=uβ
k = 2: direita
u=0
uα=u1>0 k = 3: abaixo
k = 4: acima
u3<0
154
Algoritmo de Liang-Barsky
155
Clipping de Área
156
Clipping de Área
5’ 4’ 5’ 4’
3
157
Clipping de Área
Algoritmo Sutherland-Hodgman
• Recorta o polígono em relação a cada uma
das bordas da janela separadamente
• Para cada borda da janela
– Processa-se todos os vértices do polígono
– Gerando-se novo conjunto de vértices para o
processamento da próxima borda
158
Clipping de Área
• Quatro casos possíveis no processamento de
polígono em relação a uma borda
1’ 1’ 1
1 2 2
3 3
4 4’ 4
I2 3
I4
2 I3
I1
1 160
Clipping de Área
Algoritmo de Sutherland-Hodgman
• Gera somente uma lista de vértices de saída
• Polígonos convexos: Recortados corretamente
• Polígonos côncavos: Recorte pode apresentar
– linhas estranhas
– múltiplas sub-regiões disjuntas
• Exemplo: lista final de vértices
1’ → 2 → 3 → 4’ → 5’ → 5 → 6’ → 1’
1’ 1’ 2
1 2
4’
4 4’ 3 3
5’ 5’
5 6’ 5
6 6’
161
Clipping de Área
163
Clipping de Polígonos
início 1’ 2 Gera duas 2
1’
1 áreas de
fim 4’ polígonos 3
3 4’
4 separadas
5’ 5’
6 6’ 5 6’ 5
• Usado para clipping de polígonos arbitrários
contra outros (incluindo buracos: processa
no sentido anti-horário) Cap. 19, Foley et al.
• Usado para remoção de superfícies
escondidas (hidden-surface)
164
Clipping de Polígonos
Algoritmo de Liang-Barsky
• Usa equações paramétricas no cálculo das
interseções com a janela
166
Clipping de Textos
TRING
• Oposto do clipping
– Apaga partes da figura dentro da janela
• Utilizada para
– Inserções (ex.: mapas, esquemas)
– Rótulos
168