Conversão por Varrimento
Conversão vectorial? matricial Representação Vectorial Representação Matricial 2
Rasterização de Primitivas? Rasterização - converter de uma definição geométrica para pixels (matricial)? Rasterizar escolher pixels? Operação muito frequente? Deve ser eficiente!!!? Isto implica:? Utilizar aritmética de inteiros? Utilizar métodos incrementais? Utilizar somas no lugar de multiplicações 3
Conversão por varrimento do ponto? A conversão por varrimento do ponto envolve a iluminação do pixel que o contém? Ex. Os pontos em coordenadas P1(2.5, 1.2) e P2(2.8, 1.5) seriam ambos representados pelo pixel (2,1)? Em geral P(x, y)? P(int(x), int(y)) 4
Conversão por varrimento do segmento de recta? O problema 5
Conversão por varrimento do segmento de recta? O problema 6
Conversão por varrimento do segmento de recta? Método do Declive (Direct Scan Conversion)? Um segmento de recta pode ser definido por dois pontos extremos e uma equação:? Pontos? (x1, y1) e (x2, y2)? Equação? y = m*x + b (1)? onde m = y/ x, b (x1,y1) (x2,y2) y=mx+b? b = ao valor que y toma quando a recta intersecta o eixo do y. O valor de b pode ser calculado por b = y1 m*x1 Podemos determinar os valores de y incrementando o valor de x de x1 a x2 7
Conversão por varrimento do segmento de recta? Método do Declive (versão * Se m > 1, invertese x e y. 0< m <1)* versão 0< m <1 void Line1(int x1, int y1, int x2, int y2, int color) { float m = (y2-y1)/(x2-x1); float b = y1 - m*x1; float y; int x; Exemplo b (x1,y1) (x2,y2) y=mx+b } PutPixel(x1,y1,color); for (x=x1+1; x<=x2; x++) { y = m*x + b; PutPixel(x,ROUND(y), color); } (9,4) (4,2.33) (5,3) 1 y=(1/3)x+1 (3,2) 3 2 2 (4,2) (3,2) (5,2.66) 3 4 5 Calcula-se m e b 1 a iteração 2 a iteração 3 a iteração 8
Conversão por varrimento do segmento de recta? Método do Declive (cont...) Problemas:? Segmentos de recta verticais.? 2 operações de ponto flutuante por pixel? Por que trabalhar em float se os pixels são inteiros??? void Line1(int x1, int y1, int x2, int y2, int color) { float m = (y2-y1)/(x2-x1); float b = y1 - m*x1; float y; int x; PutPixel(x1,y1,color); } for (x=x1+1; x<=x2; x++) { y = m*x + b; PutPixel(x,ROUND(y), color); } 9
Conversão por varrimento do segmento de recta? Simple DDA (Digital Differential Analyzer)? Este algoritmo utiliza o seguinte igualdade: m*(x+1) + b = (m*x +b) + m = y + m? Então se 0 < m < 1 então podemos considerar que x=1 e x k+1 = x k +1; y k+1 = y k + m (2)? Para segmentos com m > 1 devemos inverter os valores de x e y. Neste caso podemos assumir que y=1 e então da equação x= y/m obtemos que x=1/m e finalmente podemos calcular y k+1 = y k +1; x k+1 = x k + 1/m (3) 10
Conversão por varrimento do segmento de recta? Simple DDA (Digital Differential Analyzer)? As equações x k+1 = x k +1; y k+1 = y k + m (2) y k+1 = y k +1; x k+1 = x k + 1/m (3) são válidas se consideramos que os segmentos são processados de esquerda a direita.? Em caso contrário vamos ter que x= -1 pelo que x k+1 = x k - 1; y k+1 = y k - m (4) Ou para o caso que m>1 então temos que y= -1 e y k+1 = y k - 1; x k+1 = x k - 1/m (5)? Estas equações podem ser utilizadas também para calcular a posição dos pixels de segmentos com m<0 (Exercício) 11
Conversão por varrimento do segmento de recta? Simple DDA (versão 0< m <1) void LineDDA(int x1, int y1, int x2, int y2, int color) { float y; float m = (y2-y1)/(x2-x1); int x; PutPixel(x1,y1, color); y = y1; } for (x=x1+1; x<=x2; x++) { y += m; PutPixel(x,ROUND(y), color); }? Problemas:? Aproximações muito grosseiras de y 12
Conversão por varrimento do segmento de recta? Simple DDA (cont...) Observações:? O número total de pixels desenhados pelo método DDA é igual a max( x, y)? Para segmentos (S) horizontais/verticais o max( x, y) = Length(S) ideal!!!? Para segmentos oblíquos com ângulo de inclinação de 45 0 então: Length(S) = Sqrt( x 2 + y 2 ) = Sqrt(2* x 2 ) = = Sqrt(2)* x 1,41*dx x = 0,71* Length (S)? O segmento S só tem um 71% dos pontos!!! 13
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham (Bresenham, J.E. Algorithm for computer control of a digital plotter, IBM Systems Journal, January 1965, pp. 25-30.)? É um algoritmo eficiente já que apenas recorre a adições e subtracções inteiras e multiplicações por 2.? Ideia fundamental: A melhor aproximação ao segmento de recta verdadeiro é dada pelos pixels do raster a menor distância do segmento de recta verdadeiro 14
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham? Em vez de computar o valor do próximo y em ponto flutuante, o problema fica reduzido a decidir se o próximo pixel vai ter coordenadas (x + 1, y) ou (x + 1, y + 1)? Esta decisão requer que se avalie se a linha passa acima ou abaixo do ponto médio (x + 1, y + 1) (x + 1, y + ½) (x, y) (x + 1, y) 15
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham? Variável de decisão V é dada pela classificação do ponto médio com relação ao semi-espaço definido pela recta V? Caso 1: Linha passou abaixo do ponto médio (x+1,y+1) ax+by+c=v (x,y+1) onde V = 0 (x,y) sobrea recta V < 0 (x,y) abaixodarecta (x,y+½) V 1 V > 0 (x,y) acimadarecta (x+1,y+½) V 1 =a(x+ 1)+b(y+ 12)+c V 0 V =ax+b(y+ 12)+c (x,y) (x+1,y) 0 1 V =V +a 0 16
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham? Caso 2: Linha passou acima do ponto médio (x+1,y+2) (x,y+1) (x+1,y+ 1+ ½) V 1 (x+1,y+1) V 1 = a ( x+1)+b( y+1+ 1 2 )+c V 0 = ax+b ( y + 1 2 )+c V 1 = V 0 +a +b V 0 (x,y+½) (x,y) 17
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham? Coeficientes da recta a = y 2 y 1 b = x 1 x 2 c = x 2 y 1 x 1 y 2? Para iniciar o algoritmo, precisamos saber o valor de V em (x 1 + 1, y 1 + ½) V = a (x 1 + 1) + b (y 1 + ½) + c = a x 1 + b y 1 + c + a + b/2 = a + b/2 como a x 1 + b y 1 + c = 0 então temos que V = a + b/2? Podemos evitar a divisão por 2 multiplicando a, b e c por 2 (não altera a equação da recta) 18
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham (0 a 45º) a y 2 y 1 b x 1 x 2 V 2 * a + b x x 1 y y 1 Enquanto x x 2 fazer: Pintar pixel (x, y) x x + 1 Se V 0 Então V V + 2 * a Senão V V + 2 * (a + b) ; y y + 1 19
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham? Outra versão deste algoritmo pode ser encontrada em: http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html http://www.gocad.org/~caumon/teach/cg/bresenham.pdf 20
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham Extensão ( ângulo de inclinação)? Ver no documento AlgBre.zip (nos sumários práticos da disciplina) 21
Conversão por varrimento do segmento de recta? O Algoritmo de Bresenham Implementação Java http://www.cs.unc.edu/~mcmillan/comp136/lecture6/lines.html Applet http://www.cs.technion.ac.il/~cs234325/applets/applets/bresenham/germanapplet.html 22
Conversão por varrimento da circunferência? Uma circunferência é uma figura simétrica!? Qualquer algoritmo por varrimento da circunferência pode tirar partido desta simetria para desenhar oito pontos a partir de cada valor que o algoritmo calcula. 23
Conversão por varrimento da circunferência? Exemplo: Simetria a 4 eixos 24
? Método Polinomial Conversão por varrimento da circunferência? Uma circunferência pode ser definida pela seguinte equação polinomial: y 2 = r 2 x 2, onde r raio da circunferência? Então cada coordenada x, no sector que vai de 90º a 45º é determinada por sucessivos incrementos de x de 0 a 2 2 2 2 2 e r / 2 ( x = r y 2x = r ) 2 cada coordenada y é calculada por r x? Observação: este método tem operações aritméticas muito custosas para o computador? é muito pouco eficiente!!! 2 25
Conversão por varrimento da circunferência? Método Polinomial Organigrama: 1. Inicializar: r - raio, (h, k) centro da circunferência: (x, y) = (0,0); i = incremento; xfim = r/sqrt(2); 2. Testar se a circunferência foi gerada totalmente: se x > xfim, STOP 3. Calcular o valor de y: y = sqrt(r 2 -x 2 ) 4. Desenhar os pontos da simetria: (x+h, y+k); (-x+h, -y+k); (y+h, x+k); (-y+h, -x+k); (-y+h, x+k); (y+h, -x+k); (-x+h, y+k); (x+h, -y+k) 5. Incrementar x: x = x+i 6. Continuar no passo 2 26
Conversão por varrimento da circunferência? Método Trigonométrico Uma circunferência pode ser definida mediante a utilização de funções trigonométricas: x = r*cos(θ); θ y = r*sen(θ) θ onde θ ângulo corrente r raio da circunferência Com este método, θ é sucessivamente incrementado de 0 a π/4 e cada valor de x e y é calculado Este método tem operações aritméticas ainda mais custosas que o método polinomial? é muito pouco eficiente!!! 27
Conversão por varrimento da circunferência? Método Trigonométrico Organigrama: 1. Inicializar r - raio, (h, k) centro da circunferência: (x,y) = (0,0), i = incremento, θ fim = (22/7)/4 (=π/4=45º); θ=0 2. Testar se a circunferência foi gerada totalmente: se θ > θ fim, STOP 3. Calcular os valores de x e y: x = r*cos(θ); y = r*sen(θ) 4. Desenhar os pontos da simetria: (x+h, y+k); (-x+h, -y+k); (y+h, x+k); (-y+h, -x+k); (-y+h, x+k); (y+h, -x+k); (-x+h, y+k); (x+h, -y+k) 5. Incrementar θ: θ = θ + i 6. Continuar no passo 2 28
Conversão por varrimento da? Observações gerais: circunferência? Para traçar eficientemente uma circunferência deve ser evitada a utilização de funções trigonométricas e funções de potências.? Para encontrar os pontos de conversão por varrimento da circunferência é desejável efectuar apenas cálculos de adição e subtracções inteiras, assim como multiplicações por potências de 2.? O algoritmo de Bresenham permite que tal seja conseguido!!! 29
Conversão por varrimento da? Algoritmo de Bresenham para a circunferência circunferência? Se é usada a simetria em relação a quatro eixos, apenas temos de gerar os pontos num sector angular de 45º? Se os pontos forem gerados de 90º a 45º, apenas serão feitos movimentos nas direcções de +x e y 30
Conversão por varrimento da circunferência? Algoritmo de Bresenham para a Circunferência (cont...)? Ideia básica A melhor aproximação à circunferência verdadeira será definida por aqueles pixels que estão a menor distância da circunferência verdadeira. 31
Conversão por varrimento da circunferência? Algoritmo de Bresenham para a Circunferência (cont...)? Note que se os pontos são gerados de 90º a 45º, podemos determinar cada novo tomando uma das seguintes acções:? Mover uma unidade da direcção +x? Mover uma unidade na direcção +x e uma na direcção -y? É preciso um método (eficiente) para decidir entre essas duas alternativas!!! 32
Conversão por varrimento da circunferência? Algoritmo de Bresenham para a circunferência Sejam: Relativamente ao pixel P 3 : 2 2 2 D( Si ) = ( xi 1 + 1) + yi 1 r Relativamente ao ponto P 2 2 2 D( T ) ( x + 1) + ( y 1 r Por definição D(S i )>0 e D(T i ) 0 Seja d i = D(S i ) + D(T i ) Então d A partir dessa equação e sabendo que (x 0,y 0 ) é (0,r) podemos obter que: d 1 = 3-2*r i = i 1 i 1 ) 2 2 2 2 2 i = xi 1 + 1) + yi 1 r + ( xi 1 + 1) + ( yi 1 1) ( r 2 2 P(x i-1,y i-1 ) 33
Conversão por varrimento da circunferência? Algoritmo de Bresenham para a circunferência P(x i-1,y i-1 ) Se d i 0 então sabemos que x i+1 = x i + 1; y i+1 = y i Utilizando a recorrência d i (Exercício) podemos determinar que d i+1 = d i + 4x i + 6 Se d i > 0 então sabemos que x i+1 = x i + 1; y i+1 = y i -1 Utilizando a recorrência d i (Exercício) podemos determinar que d i+1 = d i + 4(x i y i )+ 10 34
Conversão por varrimento da circunferência? Algoritmo de Bresenham para a circunferência Organigrama: 1. Inicializar r - raio, (h, k) centro da circunferência: x = 0; y = raio da circunferência; d = 3-2*r; 2. Testar se a circunferência foi gerada totalmente: se x > y, STOP 3. Calcular a localização do próximo pixel: Se d<0? d = d+4*x+6; x = x+1; Se d 0? d = d+4*(x-y)+10; x = x+1; y = y-1; 4. Desenhar os pontos da simetria: (x+h, y+k); (-x+h, -y+k); (y+h, x+k); (-y+h, -x+k); (-y+h, x+k); (y+h, -x+k); (-x+h, y+k); (x+h, -y+k) 5. Continuar no passo 2 35
Conversão por varrimento da elipse? Definição polinomial da elipse? A elipse apresenta, tal como a circunferência simetrias.? As simetrias da elipse são em relação a dois eixos em vez de a quatro eixos.? Definição Polinomial: ( x? onde h) 2 a 2 + ( y k) 2 b = 1? (h, k) centro da elipse;? a cumprimento do eixo maior? b cumprimento do eixo menor 2 Neste método: x varia de h até a; o valor de y é determinado por: 2 x h y = b 1 + k 2 a 36
Conversão por varrimento da elipse? Definição polinomial da elipse Organigrama: 1. Inicializar a cumprimento do eixo maior, b cumprimento do eixo menor, (h, k) centro da elipse: x = 0; i = incremento; xfim = a; 2. Testar se a elipse foi gerada totalmente: se x > xfim, STOP 3. Calcular o valor de y: 2 x y = b 1 a 2 4. Desenhar os pontos da simetria: (x+h, y+k); (-x+h, -y+k); (-x+h, y+k); (x+h, -y+k) 5. Incrementar x: x = x + i 6. Continuar no passo 2 37
Conversão por varrimento da elipse? Definição trigonométrica da elipse? Uma elipse pode ser definida mediante a utilização de funções trigonométricas: x = a*cos(θ)+h ; y = b*sen(θ)+k, onde θ ângulo corrente a cumprimento do eixo maior b cumprimento do eixo menor (h, k) centro da elipse? Com este método, θ é sucessivamente incrementado de 0 a π/2 e cada valor de x e y é calculado utilizando a definição trigonométrica 38
Conversão por varrimento da elipse? Definição trigonométrica da elipse Organigrama: 1. Inicializar a cumprimento do eixo maior, b cumprimento do eixo menor, (h, k) centro da elipse: i = incremento, θ fim = (11/7) (=π/2=90º); θ = 0 2.Testar se a elipse foi gerada totalmente: se θ > θ fim, STOP 3. Calcular os valores: x = a*cos(θ); y = b*sen(θ) 4. Desenhar os pontos da simetria: (x+h, y+k); (-x+h, -y+k); (-x+h, y+k); (x+h, -y+k) 5. Incrementar θ: θ = θ +i 6. Continuar no passo 2 39
? Arcos Conversão por varrimento de arcos? Um arco pode ser gerado quer usando o método polinomial que o trigonométrico.? Quando é utilizado o método trigonométrico? O valor inicial θ e igual a θ 1 e o valor final θ 2? Os restantes passos são semelhantes aos usados para a conversão por varrimento da circunferência.? Quando é utilizado o método polinomial? O valor de x varia entre x 1 e x 2? Os valores de y são calculados pela expressão: 2 2 r x 40
Conversão por varrimento de arcos? Arcos Organigrama (Método Trigonométrico) 1. Inicializar a eixo maior, b cumprimento do eixo menor, (h, k) centro do arco: i = incremento, θ - ângulo inicial, θ 1 ângulo final 2. Testar se o arco foi gerado totalmente: se θ > θ 1, STOP 3. Calcular os valores: x = a*cos(θ)+h; y = b*sen(θ)+k 4. Desenhar um ponto nas coordenadas (x,y) 5. Incrementar θ: θ = θ + i 1. Continuar no passo 2 Nota: arco circular a = b = raio da circunferência 41
Geração de Caracteres Em Computação Gráfica existem duas técnicas básicas para a geração de caracteres: 1. Cada caracter é definido através do seu contorno (curva o linha poligonal) que se desenha utilizando procedimentos do tipo raster. Esta solução é custosa computacionalmente e não é muito utilizada em aplicações de processamento de texto. Apenas é utilizada em aplicações específicas que editem fontes. 2. Cada caracter é definido em termos de um bitmap rectangular. Gerar um caracter equivale a copiar apenas um bitmap para o ecrã. Todos os caracteres de todas as fontes disponíveis estão assim representadas com um respectivo bitmap. 42
Aliasing vs Anti-aliasing? A discretização dos segmentos pode causar distorções visuais como cisalhamento ou efeito de escada.? Essas distorções são chamadas de aliasing? Para reduzir o problema de aliasing, usa-se uma técnica chamada anti-aliasing? A técnica consiste em uma superamostragem (uma vez que o aliasing é causada por uma subamostragem) 43
SUPERAMOSTRAGEM dividir os pixels em subpixels (i.e. 9), aplicar o algoritmo de Bresenham nesses sub-pixels contar o número de sub-pixels acesos por pixel O pixel será aceso com intensidade proporcional ao número de sub-pixels acesos. 3 3 1 3 3 2 44
Exemplo de Anti-aliasing em Linhas? Quando a cor de fundo não é preto, o anti-aliasing deve fazer uma composição da intensidade com a cor de fundo.? Anti-aliasing é necessário não só para linhas, mas também para estruturas mais complexas o que torna esta tarefa mais complicada. 45