260 likes | 488 Views
Dispositivos de Visualização e Rasterização. Alex F. V. Machado alexcataguases@hotmail.com. Dispositivos de Visualização. Toda imagem criada através de recursos computacionais deve ser representada em algum dispositivo físico que permita a sua visualização.
E N D
Dispositivos de Visualizaçãoe Rasterização Alex F. V. Machado alexcataguases@hotmail.com
Dispositivos de Visualização • Toda imagem criada através de recursos computacionais deve ser representada em algum dispositivo físico que permita a sua visualização. • Diversas tecnologias e diferentes tipos de dispositivos são utilizados para gerar representações visuais.
Dispositivos de Visualização É possível classificar os dispositivos de exibição (traçadores, impressoras e terminais de vídeo) em duas principais categorias, segundo a forma pela qual as imagens são geradas: • Dispositivos vetoriais: traçadores digitais, osciloscópio e monitor CRT (Cathode Ray Tube). • Dispositivos matriciais: Impressoras e Dispositivos de Vídeo de Varredura (Raster Scanning VDUs)
Dispositivos de Visualização • Dispositivo gráfico vetorial (osciloscópio)
Dispositivos de Visualização • Dispositivo gráfico matricial(Dispositivos de Vídeo de Varredura)
Dispositivos de Visualização • Dispositivo gráfico matricial(Dispositivos de Vídeo de Varredura)
Representação Vetorial x Matricial • Normalmente, gráficos são definidos através de primitivas geométricas como pontos, segmentos de retas, polígonos, etc • Representação vetorial • Dispositivos gráficos podem ser pensados como matrizes de pixels (rasters) • Representação matricial • Rasterização é o processo de conversão entre representações vetorial e matricial
Representação Vetorial x Matricial • Obs.: • SRU - Sistema de Referência do Universo • SRT - Sistema de Referência da Tela • SRC - Sistema de Referência da Câmera (3D)
Considerações Gerais • Rasterização é um processo de amostragem • Domínio contínuo discreto • Problemas de aliasing são esperados • Cada primitiva pode gerar um grande número de pixels • Rapidez é essencial • Em geral, rasterização é feita por hardware • Técnicas de antialiasing podem ser empregadas, usualmente extraindo um custo em termos de desempenho
Rasterização de Segmentos de Reta • Segmento de reta entre P1= (x1, y1) e P2= (x2, y2) • Já foi recortado com relação ao viewport • Objetivo é pintar os pixels atravessados pelo segmento de reta • Na verdade, nem todos, apenas os mais próximos • Reta de suporte dada por a x + b y + c = 0 • Queremos distinguir os casos • Linhas ~ horizontais computar y como função de x • Linhas ~ verticais computar x como função de y
Rasterização de Segmentos de Reta(algoritmo básico) yi = m xi + b onde: m= Dy/Dx b = y1 - m x1
Rasterização de Segmentos de Reta(algoritmo básico) yi = m xi + b onde: m= Dy/Dx b = y1 - m x1
Rasterização de Segmentos de Reta(algoritmo básico) yi = m xi + b onde: m= Dy/Dx b = y1 - m x1 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); } }
Exemplo (x2,y2) y=mx+b b (x1,y1) (5,3) (4,2.33) (9,4) 3 y=(1/3)x+1 (3,2) (4,2) 2 2 (5,2.66) 1 (3,2) 3 4 5 Calcula-se m e b 3a iteração 1a iteração 2a iteração Rasterização de Segmentos de Reta(algoritmo básico) yi = m xi + b onde: m= Dy/Dx b = y1 - m x1 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); } }
② addition ① multiplication ③ round operation Como tirar a multiplicação? Como melhorar o algoritmo? void Line2(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); } }
Rasterização de Segmentos de Reta(outros algoritmos) (Algoritmo de linha incremental) (Algoritmo de Bresenham)
Rasterização de Segmentos de Reta(algoritmo de linha incremental) Se xi+1 = xi + 1 então yi+1 = yi + Dy/Dx m 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 = y+m; PutPixel(x,ROUND(y), color); } }
Rasterização de Segmentos de Reta(algoritmo de linha incremental) Se xi+1 = xi + 1 então yi+1 = yi + Dy/Dx 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 = y+m; PutPixel(x,ROUND(y), color); } } m • Ainda são necessários uma adição de floats e uma round operation. • É possível fazer um algoritmo apenas com somas de inteiros.O nome desse algoritmo é: Bresenham’s algorithm.
Rasterização de Segmentos de Reta (Algoritmo de Bresenham) void BresLine(int x1, int y1, int x2, int y2, int cor) x = x1; y = y1; dy = y2-y1; dx = x2-x1; m = dy/dx; e = m – 0.5; for(i=1;i<=dx;i++){ WritePixel(x, y); IF (e > 0) { y = y+1; e = e – 1; } e = e+m; x = x+1; PutPixel(x,ROUND(y), color); }
Rasterização de Segmentos de Reta (Algoritmo de Bresenham) Outros Octantes
Rasterização de Segmentos de Reta (Algoritmo de Bresenham)Vantagens: