Primitivas Gráficas
Fonte: Material do Prof. Robson Pequeno
de Sousa e do Prof. Robson Lins
Prof. Márcio Bueno
{cgtarde,cg...
Traçado de Primitivas em Dispositivos
Matriciais
Computação Gráfica - Márcio Bueno
 Conversão matricial (ou por varredura...
Traçado de Retas
Computação Gráfica - Márcio Bueno
 A reta é a primitiva 2D mais comum
 Todos wireframes (modelos de ara...
Características Desejáveis para o
Traçado de Retas
Computação Gráfica - Márcio Bueno
 Linearidade
 Os pixels traçados de...
Correção no Traçado de Retas
Computação Gráfica - Márcio Bueno5/42
Propriedades Exigidas no Traçado de Retas
Computação Gráfica - Márcio Bueno
 Precisão
 os segmentos devem iniciar e term...
Método do Declive - Algoritmo DDA
(Digital Diferential Analyzer)
Computação Gráfica - Márcio Bueno
 Algoritmo DDA (ou do ...
Implementação do Algoritmo DDA (em C)
Computação Gráfica - Márcio Bueno
void DDA(int X1,Y1,X2,Y2)
{
int Length, I;
float X...
Exemplo do DDA
Computação Gráfica - Márcio Bueno
 Compute quais pixeis devem ser escolhidos para
representar a reta de (6...
Computação Gráfica - Márcio Bueno
Reta de (6,9) para (11,12).
Length := Max of (ABS(11-6),ABS(12-9)) = 5
Xinc := 1
Yinc :=...
Retas Rápidas – Método do Ponto Médio
Computação Gráfica - Márcio Bueno
 Vamos estudar uma versão do Algoritmo de Bresenh...
Computação Gráfica - Márcio Bueno
 Queremos desenhar uma reta entre os pontos (x1,y1) e
(x2,y2) com declive m entre 0 e 1...
Computação Gráfica - Márcio Bueno
 Para as retas do 1º octante, dado um pixel sobre a reta, o
próximo pixel é para direit...
Forma Implícita da Reta
Computação Gráfica - Márcio Bueno
 Vamos determinar um método para calcular de que
lado da reta e...
Estudo do valor da Função
Computação Gráfica - Márcio Bueno
 Forma Implícita
 Em que
 a = dy, b = - dx e c = dx.B
 É f...
Computação Gráfica - Márcio Bueno
 Para o teste do ponto-médio, basta calcular
F(M) = F(xp + 1,yp + 1/2) e verificar o se...
Determinando a Forma Incremental
Computação Gráfica - Márcio Bueno
 Se E for escolhido, M é incrementado de 1 na direção ...
Determinando a Forma Incremental
Computação Gráfica - Márcio Bueno
 Se NE é escolhido, M é incrementado de 1 em ambas
as ...
Determinando o Ponto Inicial
Computação Gráfica - Márcio Bueno
 Como o primeiro pixel corresponde ao ponto (x1,y1),
pode-...
Algoritmo
Computação Gráfica - Márcio Bueno20/42
Exemplo
Computação Gráfica - Márcio Bueno
 Indicar que localizações serão calculadas pelo algoritmo
de Bresenham quando s...
Traçado de Circunferência
Computação Gráfica - Márcio Bueno
 A equação de uma circunferência com centro na origem e
raio ...
Traçado de Circunferência
Computação Gráfica - Márcio Bueno
 Algoritmos Alternativos
 polígono regular de n lados é usad...
Traçado de Circunferência
Computação Gráfica - Márcio Bueno
 Algoritmos Alternativos
 equação explícita da circunferênci...
Simetria de Ordem 8
Computação Gráfica - Márcio Bueno
 O traçado de uma circunferência pode tirar proveito
de sua simetri...
Simetria de Ordem 8
Computação Gráfica - Márcio Bueno
void PontosCircunferência(int x,int y,int valor)
{
PintaPixel(x,y,va...
Algoritmo do Ponto Médio para
Circunferência
Computação Gráfica - Márcio Bueno
 Suponha que desenhamos o pixel (xp,yp). Q...
Algoritmo do Ponto Médio para
Circunferência
Computação Gráfica - Márcio Bueno
 Considere apenas um arco de 45º da circun...
ALGORITMO DO PONTO MÉDIO PARA
CIRCUNFERÊNCIA
Computação Gráfica - Márcio Bueno
 Sinal da função através da equação implíc...
Gerando a Variável de Decisão
Computação Gráfica - Márcio Bueno30/42
Gerando a Variável de Decisão
Computação Gráfica - Márcio Bueno
 De forma semelhante a rasterização da reta, determina-se...
Variável de Decisão Inicial
Computação Gráfica - Márcio Bueno
 Se iniciamos em (0,R), o próximo ponto médio
estará em (1,...
Algoritmo do Ponto Médio para
Circunferência
Computação Gráfica - Márcio Bueno
void pontomedio(int raio, int valor) {
int ...
Resolução Gráfica
Computação Gráfica - Márcio Bueno
 Todos os dispositivos de entrada e saída gráficos
utilizam virtualme...
Resolução Gráfica
Computação Gráfica - Márcio Bueno
 Quatro parâmetros definem a resolução gráfica
 ndh - o número de po...
Resolução Gráfica
Computação Gráfica - Márcio Bueno
 A partir dos 4 parâmetros as seguintes medidas são definidas:
 reso...
Sistemas de Coordenadas
Computação Gráfica - Márcio Bueno
 De forma geral são definidos três sistemas de
coordenadas:
 S...
Sistemas de Coordenadas
Computação Gráfica - Márcio Bueno
 Sistema de coordenadas normalizadas do dispositivo
(NDC).
 Es...
Sistemas de Coordenadas
Computação Gráfica - Márcio Bueno
 Sistema de Coordenada do mundo.
 Sistema de Coordenada dispos...
Sistemas de Coordenadas
Computação Gráfica - Márcio Bueno
 Transformação de NDCs para dispositivos
 Transformação de coo...
Sistemas de Coordenadas
Computação Gráfica - Márcio Bueno
 Seqüência de transformações
41/42
Exercício
Computação Gráfica - Márcio Bueno
 Escreva os procedimentos "inp_to_ndc",
"ndc_to_user", "user_to_ndc" e "ndc_t...
Próximos SlideShares
Carregando em…5
×

Cg 03 primitivas_graficas

257 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
257
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Cg 03 primitivas_graficas

  1. 1. Primitivas Gráficas Fonte: Material do Prof. Robson Pequeno de Sousa e do Prof. Robson Lins Prof. Márcio Bueno {cgtarde,cgnoite}@marciobueno.com
  2. 2. Traçado de Primitivas em Dispositivos Matriciais Computação Gráfica - Márcio Bueno  Conversão matricial (ou por varredura)  processo que permite realizar a conversão de um desenho qualquer armazenado na memória de imagem para um dispositivo matricial (ou raster)  Primitivas Gráficas  reta, circunferência,elipse 2/42
  3. 3. Traçado de Retas Computação Gráfica - Márcio Bueno  A reta é a primitiva 2D mais comum  Todos wireframes (modelos de arame) 3D são eventualmente retas 2D  Os algoritmos aperfeiçoados contêm numerosas técnicas e truques que ajudam a projetar algoritmos mais avançados 3/42
  4. 4. Características Desejáveis para o Traçado de Retas Computação Gráfica - Márcio Bueno  Linearidade  Os pixels traçados devem dar a aparência de que estão sobre uma reta  Espessura (densidade) uniforme  A densidade da reta é dada pelo número de pixels traçados dividido pelo comprimento da reta. Para manter a densidade constante, os pixels devem ser igualmente espaçados.A imagem do segmento de reta não deve variar de espessura ao longo de sua extensão. 4/42
  5. 5. Correção no Traçado de Retas Computação Gráfica - Márcio Bueno5/42
  6. 6. Propriedades Exigidas no Traçado de Retas Computação Gráfica - Márcio Bueno  Precisão  os segmentos devem iniciar e terminar nos pontos especificados. Caso isso não ocorra, pequenos gaps podem surgir entre o final de um segmento e o início de outro  Densidade independente da inclinação  para segmentos de retas de diferentes inclinações  Continuidade  a imagem não apresenta interrupções indesejáveis  Rapidez no traçado dos segmentos 6/42
  7. 7. Método do Declive - Algoritmo DDA (Digital Diferential Analyzer) Computação Gráfica - Márcio Bueno  Algoritmo DDA (ou do declive) usa o método incremental  Equações para 0 ≤ m ≤ 1 yi + 1 = mxi + 1 + b = m(xi + dx) + b => yi + 1 = yi + mdx, faça dx = 1 => yi + 1 = yi + m  Equações para m > 1 xi + 1 = xi + 1/m , faça dy = 1 7/42
  8. 8. Implementação do Algoritmo DDA (em C) Computação Gráfica - Márcio Bueno void DDA(int X1,Y1,X2,Y2) { int Length, I; float X,Y,Xinc,Yinc; Length = ABS(X2 - X1); if (ABS(Y2 -Y1) > Length) Length = ABS(Y2-Y1); Xinc = (X2 - X1)/Length; Yinc = (Y2 -Y1)/Length; DDA Cria boas linhas, mas consome muito tempo devido as funções de arredondamento. *DDA: Digital Differential Analyzer (Método do Declive) X = X1; Y =Y1; while(X<X2){ setpixel(Round(X),Round(Y)); X = X + Xinc; Y =Y +Yinc; } } 8/42
  9. 9. Exemplo do DDA Computação Gráfica - Márcio Bueno  Compute quais pixeis devem ser escolhidos para representar a reta de (6,9) to (11,12).  Length = ?  Xinc = ?  Yinc = ? 6 7 8 9 10 11 12 13 9 10 11 12 13 9/42
  10. 10. Computação Gráfica - Márcio Bueno Reta de (6,9) para (11,12). Length := Max of (ABS(11-6),ABS(12-9)) = 5 Xinc := 1 Yinc := 0.6 OsValores computados são: (6,9), (7,9.6), (8,10.2), (9,10.8), (10,11.4), (11,12) DDA Exemplo 6 7 8 9 10 11 12 13 9 10 11 12 13 10/42
  11. 11. Retas Rápidas – Método do Ponto Médio Computação Gráfica - Márcio Bueno  Vamos estudar uma versão do Algoritmo de Bresenham (1965) denominada Mid Point Line Algorithm ("Algoritmo do Ponto-Médio ou Meio-Ponto para Retas") por Foley (1997).  Bresenham desenvolveu um algoritmo clássico que usa apenas variáveis inteiras, e permite que o cálculo de (xi+1,yi+1) seja feito incrementalmente, usando os cálculos já feitos para (xi,yi). 11/42
  12. 12. Computação Gráfica - Márcio Bueno  Queremos desenhar uma reta entre os pontos (x1,y1) e (x2,y2) com declive m entre 0 e 1 (i.e. reta dentro do 1º octante) +x-x -y +y Retas Rápidas – Método do Ponto Médio 12/42
  13. 13. Computação Gráfica - Márcio Bueno  Para as retas do 1º octante, dado um pixel sobre a reta, o próximo pixel é para direita (E) ou para Direita acima (NE)  Tendo o pixel (xi, yi), o próximo pixel é NE em (xi+1, yi+1) ou E em (xi+1, yi) M P = (xi ,yi ) E NE Q Retas Rápidas (cont.) 13/42
  14. 14. Forma Implícita da Reta Computação Gráfica - Márcio Bueno  Vamos determinar um método para calcular de que lado da reta está do ponto M. Para isso, considere sua função implícita, F(x,y) = ax + by + c = 0.  Se dy = y2 - y1, e dx = x2 - x1,  A equação da reta em termos de sua inclinação pode ser escrita como: Bx dx dy y  14/42
  15. 15. Estudo do valor da Função Computação Gráfica - Márcio Bueno  Forma Implícita  Em que  a = dy, b = - dx e c = dx.B  É fácil verificar que:  F(x,y) = 0, ponto sobre a linha  F(x,y) > 0, para pontos abaixo da linha  F(x,y) < 0, para pontos acima da linha ( , ) . . . 0F x y dy x dx y dx B    15/42
  16. 16. Computação Gráfica - Márcio Bueno  Para o teste do ponto-médio, basta calcular F(M) = F(xp + 1,yp + 1/2) e verificar o seu sinal.  A decisão será tomada com base no valor da função no ponto (xp + 1,yp + 1/2)  define-se uma “variável de decisão”  d = a(xp + 1) + b(yp + 1/2) + c  Se d > 0, escolhemos o pixel NE  Se d < 0, escolhemos o pixel E  Se d = 0 pode-se escolher qualquer um deles Escolha de E ou NE 16/42
  17. 17. Determinando a Forma Incremental Computação Gráfica - Márcio Bueno  Se E for escolhido, M é incrementado de 1 na direção x.  Subtraindo dold de dnew para obter a diferença incremental, tem-se  dnew = dold + a. cybxad cybxayxFd ppold ppppnew   ) 2 1 ()1( ) 2 1 ()2() 2 1 ,2( 17/42
  18. 18. Determinando a Forma Incremental Computação Gráfica - Márcio Bueno  Se NE é escolhido, M é incrementado de 1 em ambas as direções, x e y.  Subtraindo dold de dnew, tem-se  dnew = dold + a + b cybxad cybxayxFd ppold ppppnew   ) 2 1 ()1( ) 2 3 ()2() 2 1 1,2( 18/42
  19. 19. Determinando o Ponto Inicial Computação Gráfica - Márcio Bueno  Como o primeiro pixel corresponde ao ponto (x1,y1), pode-se calcular diretamente o valor inicial de d para escolher entre E e NE. O primeiro ponto-médio está em (x1 + 1,y1 + 1/2) temos:  Como F(x1 , y1) está sobre a reta, temos que F(x1 , y1) = 0, daí o resultado acima. bad bacbyaxcbbyaaxd cybxayxFd start start start 2 1 2 1 2 1 . ) 2 1 ()1() 2 1 ,1( 1111 1111    F(x1, y1) 19/42
  20. 20. Algoritmo Computação Gráfica - Márcio Bueno20/42
  21. 21. Exemplo Computação Gráfica - Márcio Bueno  Indicar que localizações serão calculadas pelo algoritmo de Bresenham quando se gera por varredura um segmento de reta entre (1,1) e (8,5) em coordenadas de tela. d x y 1 + inc2 = -5 -5+ inc1 = 3 3 + inc2 = -3 -3+ inc1 = 5 5+ inc2 = -1 -1+ inc1 = 7 1 2 3 4 5 6 1 2 2 3 3 4 dx = 8 -1, dy = 5 -1 Inc1 = 2dy = 2*4 =8 Inc2 = 2*(dy – dx) = 2*(4 -7) = -6 dstart = inc1 – dx = 8 -7 = 1 21/42
  22. 22. Traçado de Circunferência Computação Gráfica - Márcio Bueno  A equação de uma circunferência com centro na origem e raio R, em coordenadas cartesianas, é dada por  A equação explicita da circunferência 2 2 2 x y R  2 2 ( ):y f x y R x    22/42
  23. 23. Traçado de Circunferência Computação Gráfica - Márcio Bueno  Algoritmos Alternativos  polígono regular de n lados é usado como aproximação para a circunferência  Desvantagem  n deve ser suficientemente grande para se ter uma boa aproximação  Quanto maior for o n  algoritmo mais lento  Estratégias de aceleração precisam ser usadas 23/42
  24. 24. Traçado de Circunferência Computação Gráfica - Márcio Bueno  Algoritmos Alternativos  equação explícita da circunferência, y=f(x) para desenhar ¼ da circunferência (os outros ¾ são desenhados por simetria)  Poderíamos variar x de 0 a R, em incrementos de uma unidade, calculando +y a cada passo através da equação acima  Desvantagens  Requer operações de multiplicação e raiz quadrada  Grandes gaps nas regiões onde a tangente à circunferência é infinita 24/42
  25. 25. Simetria de Ordem 8 Computação Gráfica - Márcio Bueno  O traçado de uma circunferência pode tirar proveito de sua simetria  Suponha que a circunferência esteja centrada na origem  Se o ponto (x,y) pertence à circunferência, pode-se calcular os sete outros pontos da circunferência Basta calcular um arco de circunferência de 45º para obter a circunferência toda 25/42
  26. 26. Simetria de Ordem 8 Computação Gráfica - Márcio Bueno void PontosCircunferência(int x,int y,int valor) { PintaPixel(x,y,valor); PintaPixel(y,x,valor); PintaPixel(y,-x,valor); PintaPixel(x,-y,valor); PintaPixel(-x,-y,valor); PintaPixel(-y,-x,valor); PintaPixel(-y,x,valor); PintaPixel(-x,y,valor); } 26/42
  27. 27. Algoritmo do Ponto Médio para Circunferência Computação Gráfica - Márcio Bueno  Suponha que desenhamos o pixel (xp,yp). Qual o proximo pixel a ser desenhado? 27/42
  28. 28. Algoritmo do Ponto Médio para Circunferência Computação Gráfica - Márcio Bueno  Considere apenas um arco de 45º da circunferência, o 2º octante, de x=0, y=R a x=y= R/(2)1/2.  Use o procedimento PontosCircunferência para traçar todos os pontos da circunferência.  Assim como o algoritmo gerador de linhas, a estratégia é selecionar entre 2 pixels na malha aquele que está mais próximo da circunferência, utilizando o sinal da função no ponto intermediário entre os dois possíveis pixels ( E ou SE). 28/42
  29. 29. ALGORITMO DO PONTO MÉDIO PARA CIRCUNFERÊNCIA Computação Gráfica - Márcio Bueno  Sinal da função através da equação implícita da circunferência F(x,y) = x2 + y2 - R2 = 0 sobre a circunferência > 0 fora da circunferência < 0 dentro da circunferência 29/42
  30. 30. Gerando a Variável de Decisão Computação Gráfica - Márcio Bueno30/42
  31. 31. Gerando a Variável de Decisão Computação Gráfica - Márcio Bueno  De forma semelhante a rasterização da reta, determina-se a variável de decisão dold  dold = F(xp+1, yp-½) = (xp+1)2 + (yp-½)2 - R2  Se dold < 0, E é escolhido e o próximo ponto médio será incrementado de 1 na direção x  dnew = F(xp+2, yp-½) = dold + (2xp + 3)  Se dold  0, SE é escolhido e o próximo ponto médio será incrementado de 1 na direção x e decrementado de 1 na direção y  dnew = F(xp+2, yp-½-1) = dold + (2xp - 2yp + 5) 31/42
  32. 32. Variável de Decisão Inicial Computação Gráfica - Márcio Bueno  Se iniciamos em (0,R), o próximo ponto médio estará em (1, R – ½), portanto o valor inicial de d é dado por:  dinit = F(1, R - ½) = 5/4 - R.  Se R for inteiro, faça h = d – ¼ -> d = h + ¼ , segue que a inicialização será h = 1 - R. dinit = 1 - R 32/42
  33. 33. Algoritmo do Ponto Médio para Circunferência Computação Gráfica - Márcio Bueno void pontomedio(int raio, int valor) { int x = 0; int y = raio; double d = 5/4 – raio; ponto_circulo (x, y, valor); while (y > x) { if (d < 0) /* escolhe E */ d + = 2.0*x + 3.0; else { /* escolhe SE */) d + = 2.0*(x – y) + 5; y - -; } x ++; ponto_circulo (x, y, valor); } /* while*/ } /*pontomedio*/ void ponto_circulo(int x, int y, int valor) { writepixel(x,y, valor); writepixel(y,x, valor) writepixel(y,-x, valor) writepixel(x,-y , valor) writepixel(-x,-y, valor) writepixel(-y, -x, valor) writepixel(-y, x, valor) writepixel(-x, y, valor) } /*ponto_circulo*/ 33
  34. 34. Resolução Gráfica Computação Gráfica - Márcio Bueno  Todos os dispositivos de entrada e saída gráficos utilizam virtualmente uma malha retangular de posições endereçáveis a qual é definida como retângulo de visualização.  Resolução gráfica de um dispositivo é o número de posições (pixels) horizontais e verticais que ele pode distinguir. 34/42
  35. 35. Resolução Gráfica Computação Gráfica - Márcio Bueno  Quatro parâmetros definem a resolução gráfica  ndh - o número de posições endereçáveis horizontalmente  ndv - o número de posições endereçáveis verticalmente.  width - a largura do retângulo de visualização em mm.  height - a altura do retângulo de visualização em mm. 35/42
  36. 36. Resolução Gráfica Computação Gráfica - Márcio Bueno  A partir dos 4 parâmetros as seguintes medidas são definidas:  resolução horizontal: horiz_res = ndh / width  tamanho do ponto horizontal: horiz_dot_size = width / ndh  resolução vertical: vert_res = ndv / height  tamanho do ponto vertical: vert_dot_size = height / ndv  total de pontos endereçáveis: total_nr_dots = ndh * ndv  resolução de área: area_res = total_nr_dots / (width * height)  razão de aspecto gráfica: aspect_ratio = vert_dot_size / horiz_dot_ size  razão de aspecto físico: physical_aspect_ratio = height / width 36/42
  37. 37. Sistemas de Coordenadas Computação Gráfica - Márcio Bueno  De forma geral são definidos três sistemas de coordenadas:  Sistemas de coordenadas do mundo  É um conjunto de coordenadas cartesianas em um intervalo qualquer definido pelo usuário.  Sistemas de coordenadas do dispositivo  É um conjunto de pixels endereçáveis pelo dispositivo. Os pixels são endereçados por dois números inteiros que dão suas coordenadas horizontal e vertical. 37/42
  38. 38. Sistemas de Coordenadas Computação Gráfica - Márcio Bueno  Sistema de coordenadas normalizadas do dispositivo (NDC).  Este sistema é intermediário entre os dois anteriores, definido de tal forma que todo conteúdo da janela de visualização possua as coordenadas variando no intervalo [0,1] X [0,1]  Vantagem da utilização de NDCs é que padrões gráficos podem ser discutidos usando um sistema de coordenadas independente de dispositivos gráficos específicos. 38/42
  39. 39. Sistemas de Coordenadas Computação Gráfica - Márcio Bueno  Sistema de Coordenada do mundo.  Sistema de Coordenada dispositivo  Sistema de Coordenada NDC 0 1 0 1 dcx ndh dcy ndv       min max min max x x x y y y     0 1 0 1 ndcx ndcy     39/42
  40. 40. Sistemas de Coordenadas Computação Gráfica - Márcio Bueno  Transformação de NDCs para dispositivos  Transformação de coordenadas do mundo para NDCs. ( *( 1)) ( *( 1)) dcx round ndcx ndh dcy round ndcy ndv     ( min) ( max min) ( min) ( max min) x x ndcx x x y y ndcy y y       40/42
  41. 41. Sistemas de Coordenadas Computação Gráfica - Márcio Bueno  Seqüência de transformações 41/42
  42. 42. Exercício Computação Gráfica - Márcio Bueno  Escreva os procedimentos "inp_to_ndc", "ndc_to_user", "user_to_ndc" e "ndc_to_user", que transformam dados entre os vários sistemas de coordenadas, conforme ilustrado na figura anterior. Repita o exercício assumindo que o intervalo de variação do sistema NDC vai de:  -1 a +1 (coordenadas normalizadas centradas)  0 a 100  Implemente os procedimentos acima. 42/42

×