Prof. Julio Arakaki Ciência da Computação - pucsp.brjarakaki/cgpi/Algoritmos_reta_circulo.pdf ·...
Transcript of Prof. Julio Arakaki Ciência da Computação - pucsp.brjarakaki/cgpi/Algoritmos_reta_circulo.pdf ·...
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
1
Primitivos gráficos - algoritmos
Prof. Julio Arakaki
Ciência da Computação
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
2
Algoritmos de reta
• Reta => infinitamente fina, ou seja, área = 0
• Problemas para apresentação num monitor “raster” utilizando-se pixels:
– deve-se escolher quais pixels melhor representa a reta
– existem muitos algoritmos que possibilitam diferentes resultados
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
3
Algoritmo de reta – equação reduzida
…
for(int x = x1; x <= x2; x++)
{
int y = (int)round(m*x + b);
desenharPonto(x, y, cor);
}
…
Através da equação de reta: y = mx + b
Problemas:
• Linhas verticais. (m = )
• Lento, pois para todo x tem-se:
uma multiplicação em “floating point”
uma adição em “floating point”
uma chamada de função de arrendondamento (“round”)
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
4
Algoritmo de reta – Digital Differential Analyser (DDA)
Algoritmo simples e também não muito eficiente
– incremental
• Incrementa x de 1 (x = 1) e atualiza y de acordo com:
• Desenha o pixel (x, round(y)) em cada iteração
y1 = mx1 + b
x2 = x1 + 1
y2 = mx2 + b
= m(x1 + 1) + b
= (mx1 + b) + m
= y1 + m
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
5
Algoritmo de reta – Digital Differential Analyser (DDA) - exemplo
(0,0)
(7,7)
m = 0.8
x = 1
x y
3.0 2.8 3
4.0 3.6 4
5.0 4.4 4
6.0 5.2 5
7.0 6.0 6
2.0 2.0 2
Round(y)
reta: (2,2) (7,6)
desenharPonto(x, round(y));
y = y + m
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
6
Algoritmo de reta – Digital Differential Analyser (DDA)
…
float y;
float m = (y2-y1)/(x2-x1);
desenharPonto(x1,y1, cor);y = y1;
while( x1 < x2 ){
x1++;
y += m;
desenharPonto(x1, ROUND(y), cor);}
…
x é um inteiro, mas y é floating point.
custo: incremento, adição em floating point
e chamada da função de arredondamento
“round(y)” para cada valor de x.
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
7
Algoritmo de reta – “Midpoint algoritm” (Bresenham – 1965)
• Mais eficiente que DDA.
– incremental e cálculo baseado em inteiros
• Em cada iteração determinamos se a reta (real) intersecciona
o próximo pixel acima (“above”) ou abaixo (“below”) da
metade (“midpoint”) do valor de y.
– se acima então A: yi+1 = yi+1
– caso contrário B: yi+1 = yi
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
8
Algoritmo de reta – “Midpoint algoritm”
• Utiliza a forma implícita da equação de reta:
• A cada iteração, verifica se o “midpoint” está acima ou abaixo da reta
Examina-se o valor de:
di=a(xi + 1) + b(yi + ½) + c
di é uma variável de decisão no passo i
axi + byi + c = 0 : (xi, yi) Na reta
axi + byi + c < 0 : (xi, yi) Acima da reta
axi + byi + c > 0 : (xi, yi) Abaixo da reta
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
9
Algoritmo de reta – “Midpoint algoritm”
• 1) Se di > 0 então escolhe-se o pixel A novo “midpoint” deverá ser checado:
(xi + 2, yi + 3/2) : di+1 = a(xi + 2) + b(yi + 3/2) + c
= [a(xi + 1) + b(yi +1/2) + c] + a + b =
= di + a + b
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
10
• 2) Similarmente, se di < 0 então escolhe-se o pixel B e o novo “midpoint” é:
(xi + 2, yi + 1/2) : di+1 = a(xi + 2) + b(yi + 1/2) + c
= [a(xi + 1) + b(yi +1/2) + c] + a = di + a
Algoritmo de reta – “Midpoint algoritm”
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
11
Algoritmo de reta – “Midpoint algoritm”
• No ponto inicial, a variável de decisão é calculada da seguinte forma:
(x1+1, y1+1/2): d1 = a(x1 + 1) + b(y1 + 1/2) + C
= [ax1 + by1 + c] + a + b/2
= 0 + a + b/2
Uma parte fracionária é introduzida (b/2), mas como interessa-se somente o
sinal de d, Pode-se multiplicar a expressão por 2:
di = 2a + b
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
12
• Sabendo-se que y=(dy/dx)*x + C, temos: (dy/dx)*x – y + C = 0
Multiplicando por dx todos os termos temos:
dy*x – dx*y + dx*c = 0
Então:
a = dy = y2 – y1
b = -dx = -(x2 – x1)
c = Cdx
Algoritmo de reta – “Midpoint algoritm”
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
13
Algoritmo de reta – “Midpoint algoritm”
OU SEJA,
Calculo da variável de decisão:
- Inicio: substituindo os valores de a e b obtemos:
di = 2a + b = 2dy - dx
- Para di > 0 :
Multiplicando por 2 e substituindo a e b :
di+1 = di + 2(a + b) = di + 2(dy – dx)
- Para di < 0 :
Multiplicando por 2 e substituindo a e b :
di+1 = di + 2a = di + 2(dy)
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
14
Algoritmo de reta – “Midpoint algoritm”
…
dx = x2 - x1;
dy = y2 - y1;
d = 2*dy – dx;
x = x1;
y = y1;
desenharPonto(x, y, cor);
while (x < x2) {
if (d <= 0){
d = d + (2*dy);
}
else {
d = d + 2*(dy - dx);
y = y + 1;
}
x = x + 1;
desenharPonto(x, y, cor);
}
…
inicialização
seleciona B
seleciona A
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
15
Algoritmo de reta – “Midpoint algoritm”
Traçar a reta passando por: P1(2,2) e P2(7,6)
dx = (7 - 2) = 5
dy = (6 - 2) = 4
Inicial: (d = 2*dy - dx)
Ou seja, d = 3
se d > 0 (d = d + 2 * dy)
ou seja, d = d - 2
se d < 0 (d = d + 2*(dy - dx))
ou seja, d = d + 8
Exemplo:
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
16
Algoritmo de reta – “Midpoint algoritm”
(0,0)
(7,7)
reta: (2,2) (7,6)dx = 5
dy = 4
d = 3
x y
3 3 1
4 4 -1
5 4 7
6 5 5
7 6 3
2 2 3
d
if d>0 then d=d-2, y=y+1
if d<0 then d=d+8
x=x+1
1 2 3 4 5 6 7
1
2
3
4
5
6
7
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
17
Algoritmo de círculo – “Midpoint algoritm”
• Círculo com raio r e centro (xc, yc) é definido parametricamente como:
x = xc + rcos
y = yc + rsen
Variando de 0 até 2 plotando-se as coordenadas:
– Dificuldade para efetivamente controlar a dimensão do passo, para eliminar os
espaços entre os pixels
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
18
Algoritmo de círculo – “Midpoint algoritm”
• Forma implícita do círculo:
• Utiliza um esquema similar ao algoritmo de
reta (“midpoint”):
– Necessário a determinação dos pixels de
um octante, os pixels de outros octantes
são determinados pela simetria
– A variável de decisão é calculada da
seguinte forma:
di:
< 0 se (xi, yi) dentro do círculo
= 0 se (xi, yi) no círculo
> 0 se (xi, yi) fora do círculo
(x – xc)2 + (y – yc)
2 – r2 = 0
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
19
Algoritmo de círculo – “Midpoint algoritm”
• Como na reta, determina-se o valor da variável de decisão pela substituição
do “midpoint” do próximo pixel pela forma implícita do círculo:
di = (xi + 1)2 + (yi – 1/2)2 - r2
– Se di < 0 escolhe-se pixel A senão escolhe-se pixel B
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
20
Algoritmo de círculo – “Midpoint algoritm”
• Semelhante ao algoritmo de reta, a escolha de A ou B pode ser utilizado para
determinar o novo valor de di+1
• Se A for escolhido, então o próximo “midpoint” tem o seguinte variável de
decisão:
(xi + 2, yi – 1/2) : di+1 = (xi + 2)2 + (yi – 1/2)2 – r2
= di + 2xi + 3
• Por outro lado, se B for escolhido, então a próxima variável de decisão é:
(xi + 2, yi – 3/2) : di+1 = (xi + 2)2 + (yi – 3/2)2 – r2
= di + 2xi – 2yi + 5
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
21
Algoritmo de círculo – “Midpoint algoritm”
• Assumindo-se que o raio é um valor integral, então o primeiro pixel a ser
desenhado é (0, r) e o valor inicial da vaariável de decisão é dado por:
(1, r-1/2) : d0 = 1 + (r2 – r + 1/4) – r2
= 5/4 - r
• Neste caso o valor é fracionário, e todos os outros são inteiros.
Pode-se arredondar para:
d0 = 1 - r
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
22
Algoritmo de círculo – “Midpoint algoritm”
…
d = 1-r;
x = 0;
y = r;
desenharPonto(cx+x,cy+y);
while (x < y) {
if (d < 0) {
d = d + 2*x + 3;
}
else{
d = d + 2*(x - y) + 5;
y = y – 1;
}
x = x + 1;
desenharPonto(cx+x,cy+y);
}
…
inicialização
seleciona B
seleciona A
Onde (cx, c
y) é a coordenada do centro
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
24
Algoritmo de elipse – “Midpoint algoritm”
2 2 2 2 2 2( , ) 0F x y b x a y a b
Computação Gráfica
© Julio Arakaki
Ciência da Computação
5. Primitivos gráficos
25
Algoritmo de elipse – “Midpoint algoritm”