Rasterização de linhas e polígonos

Slides:



Advertisements
Apresentações semelhantes
Continuidade: sem interrupções
Advertisements

RECORTE DE FIGURAS Algoritmo proposto para Recorte de Segmentos (atribuído a Ivan Sutherland e Dan Cohen) Para o entendimento do algoritmo a ser proposto,
Complexidade de Algoritmos Recursivos
Computação Gráfica I Conteúdo: Professor:
Cálculo 3 9. Integrais Duplas Volumes Amintas Paiva Afonso
Conceitos e Propriedades
ESTRUTURA DE DADOS LES.
Estruturas de Repetição
Programação Orientada a Objetos – Parte II
Aula 02.
Aula 02 continuação.
Recursividade Prof. Rosana Palazon.
Programação de Computadores I Prof. Eduardo 2011
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 12.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 4.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 9.
Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 11.
Cálculo - Thomas Capítulo 2.
Rasterização, Anti-aliasing e Preenchimento
Dispositivos de Visualização e Rasterização
Introdução à Computação - Jorge Macêdo
PREDIÇÃO DATA MINING AULA 13 SANDRA DE AMO
Programação Linear Método Simplex
Algoritmos de Varrimento para Desenho de Primitivas 2D
Automato de Pilha.
Recorte e seleção de linhas e polígonos
Linha de produção de imagens com o OpenGL™ (OpenGL Rendering Pipeline)
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
1 Professor Rogério B. de Andrade - Aula 001- Dez/2008 Técnicas e Linguagem de Programação.
Computação Gráfica: Aula5: Rendering e Rasterização
Outras Transforações de Imagens
Computação Gráfica: Aula5: Rendering e Rasterização
Computação Gráfica: Rendering e Rasterização
Exp_P160_00hzCI. sim_P160_00hz exp_P160_45hz sim_P120_20hz.
Rasterização de linhas e polígonos
Técnicas para algoritmos de superfície visível eficientes (Techniques for efficient visible-surface algorithms) Fabio Utzig Rodrigo Senger.
Introdução aos Sistemas de Controle
Exercicios de revisão Exercicio tirados de
Controlabilidade e Observabilidade de Equações Dinâmicas Lineares (C. T. Chen, Capítulo 6) Sistemas Lineares.
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Algoritmos e linguagens de programação 1 (aula 10)
Unidade 2. Dependência Linear e Base
Prof. Ricardo Santos PONTEIROS
Compilação de Linguagens OO Marco Simões (macs3) André Santos (alms)
1 - Equações Diferenciais Ordinárias
Computação Gráfica - Amostragem
Introdução à Linguagem C
 São utilizadas para dividir um código maior (mais complexo) em partes menores (mais simples).  Quando uma mesma tarefa é realizada várias vezes em um.
Algoritmos Comandos de repetição.
Computação Gráfica - Amostragem Profa. Mercedes Gonzales Márquez.
Aula prática 3 Aprofundando em Funções Parâmetros de uma função Uso do return Execução Variáveis Global, local e estática Monitoria de Introdução à.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Revisão Luis Antonio Tavares
Aula Prática 2 Monitoria IP/CC (~if669).
INF 1366 – Computação Gráfica Interativa Rasterização
Computação Gráfica - Amostragem Profa. Mercedes Gonzales Márquez.
DE-PARA Traduzindo Algoritmo para linguagem C Prof. Etéocles
Andréa Iabrudi 1 Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I.
PCI- Funções e Procedimentos Profa. Mercedes Gonzales Márquez.
Computação Gráfica - Amostragem Profa. Mercedes Gonzales Márquez.
Linguagem de Programação 11 Estruturas de Decisão e Repetição. Prof. Luiz José Hoffmann Filho
Introdução à Computação Gráfica Rasterização
Funcionamento Bucket sort funciona do seguinte modo: Inicialize um vetor de "baldes", inicialmente vazios. Vá para o vetor original, incluindo cada.
1 CCO 016 FUNDAMENTOS DE PROGRAMAÇÃO Universidade Federal de Itajubá Prof. Dr. Edison Oliveira de Jesus.
1/6/2016 Computação Gráfica
Dispositivos de Visualização e Rasterização
Dispositivos de Visualização e Rasterização
Computação Gráfica Interativa - Gattass
Transcrição da apresentação:

Rasterização de linhas e polígonos Computação Gráfica Interativa - Gattass 3/25/2017 Rasterização de linhas e polígonos Rasterização de Primitivas

Algoritmos de rasterização de linhas Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmos de rasterização de linhas Suponha Dx > Dy incrementa x e vê o que acontece com y Dx = 5, Dy =3 incrementa y e vê o que acontece com x Rasterização de Primitivas

Algoritmo simples de linha (no primeiro octante) Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo simples de linha (no primeiro octante) yi = m xi + b onde: m = Dy/Dx b = y1 - m x1 void Line(int x1, int y1, int x2, int y2, long int color) { float m = (y2-y1)/(x2-x1); float b = y1 - m*x1; float y; SetPixel(x1,y1, color); while( x1 < x2 ) x1++; y = m*x1 + b; SetPixel(x1,ROUND(y), color); } Rasterização de Primitivas

Algoritmo de linha incremental Computação Gráfica Interativa - Gattass 3/25/2017 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); SetPixel(x1,y1, c); y = y1; while( x1 < x2 ) x1++; y += m; SetPixel(x1,ROUND(y), c); } Rasterização de Primitivas

Algoritmo de linha baseado no erro Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de linha baseado no erro erro de manter y 0.5 - 0.5 x Rasterização de Primitivas

Algoritmo de linha baseado no erro Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de linha baseado no erro void BresLine0(int x1, int y1, int x2, int y2, int c) { int Dx = x2 – x1; int Dy = y2 - y1; float e= -0.5; SetPixel(x1, y1, c); while( x1 < x2 ) x1++; e+=Dy/Dx; if (e>=0) { y1++ ; e -= 1; } erro de manter y 0.5 - 0.5 x e = erro - 0.5 0.5 x - 0.5 Rasterização de Primitivas

Algoritmo de Bresenham Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de Bresenham ei = 2*Dx*e void BresLine0(int x1, int y1, int x2, int y2, int c) { int Dx = x2 - x1; int Dy = y2 - y1; float e= -0.5; SetPixel(x1, y1, c); while( x1 < x2 ) x1++; e+=Dy/Dx; if (e>=0) { y1++ ; e -= 1; } void BresLine1(int x1, int y1, int x2, int y2, int c) { int Dx = x2 - x1; int Dy = y2 - y1; int ei = -Dx; SetPixel(x1, y1, c); while( x1 < x2 ) x1++; ei += 2*Dy; if (ei>=0) { y1++ ; ei -= 2*Dx; } válidos somente quando Dx>Dy, x2 > x1 e y2 > y1 Rasterização de Primitivas

Equação implícita da reta Computação Gráfica Interativa - Gattass 3/25/2017 Equação implícita da reta y y2 y1 x x1 x2 E NE xp xp+1 xp+2 yp M yp+1/2 Rasterização de Primitivas

Algoritmo do ponto médio - variável de decisão - Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo do ponto médio - variável de decisão - E NE xp xp+1 xp+2 yp M yp+1/2 yp+3/2 MNE ME E NE Rasterização de Primitivas

Algoritimo do ponto médio - redução para inteiros - Computação Gráfica Interativa - Gattass 3/25/2017 Algoritimo do ponto médio - redução para inteiros - Rasterização de Primitivas

Algoritimo do ponto médio - código C - Computação Gráfica Interativa - Gattass 3/25/2017 Algoritimo do ponto médio - código C - void linhaPM(int x1, int y1, int x2, int y2) { int a = y2-y1; int b = x1-x2; int d=2*a+b; /* valor inicial da var. decisao */ int incrE = 2*a; /* incremento p/ mover E */ int incrNE = 2*(a+b); /* incremento p/ mover NE */ fragmento(x1,y1); while (x1<x2) { x1++; if (d<=0) /* escolha E */ d+=incrE; else { /* escolha NE */ d+=incrNE; y1++; } Rasterização de Primitivas

Computação Gráfica Interativa - Gattass 3/25/2017 Estilos de linha void linhaPM(int x1, int y1, int x2, int y2) { int a = y2-y1; int b = x1-x2; int d=2*a+b; /* valor inicial da var. decisao */ int incrE = 2*a; /* incremento p/ mover E */ int incrNE = 2*(a+b); /* incremento p/ mover NE */ int style[8]={1,1,0,0,1,1,0,0}; int k=1; fragmento(x1,y1); /* primeiro pixel */ while (x1<x2) { x1++; if (d<=0) /* escolha E */ d+=incrE; else { /* escolha NE */ d+=incrNE; y1++; } if (style[(++k)%8]==1) fragmento(x1,y1); Rasterização de Primitivas

Rasterização de Retas -caso geral- Computação Gráfica Interativa - Gattass 3/25/2017 Rasterização de Retas -caso geral- y 1 2 2 x y 1 x orientação outros quadrantes Rasterização de Primitivas

Rasterização de Cônicas Computação Gráfica Interativa - Gattass 3/25/2017 Rasterização de Cônicas y F(x,y) = 0 x 450 y simetrias do círculo: cada ponto calculado define 8 pixels x Rasterização de Primitivas

Rasterização de Cônicas Computação Gráfica Interativa - Gattass 3/25/2017 Rasterização de Cônicas y y=raio; for (x=0; x< y; x++) { if F(M)<0 escolha E else escolha SE Pixel (E ou SE) pinte os simétricos } x E ME M F(x,y) = 0 SE MSE Rasterização de Primitivas

Preenchimento de polígonos Computação Gráfica Interativa - Gattass 3/25/2017 Preenchimento de polígonos dados: {x0, x1, x2, x3, x4} {y0, y1, y2, y3, y4} y ys x 1 2 3 4 i0 i1 i3 i4 xi1 xi0 xi4 xi3 ymax ymin acha ymax e ymin Para cada ysÎ [ymax , ymin] Para cada aresta calcula as interseções ordena interseções desenha linhas horizontais vx= {xi1 , xi0 , xi4 , xi3} Rasterização de Primitivas

Preenchimento de polígonos (scan passando por vértices) Computação Gráfica Interativa - Gattass 3/25/2017 Preenchimento de polígonos (scan passando por vértices) y 1 i0 i1 i2 i4 ys 3 i3 5 2 4 x Rasterização de Primitivas

Preenchimento de polígonos (scan passando por vértices) Computação Gráfica Interativa - Gattass 3/25/2017 Preenchimento de polígonos (scan passando por vértices) y 1 i0 i1 i2 i4 ys 3 i3 5 2 4 x inclui vértices: i0-i1, i2-i3, i4-? não inclui vértices: i0-? L y ys x 1 2 3 5 i0 i2 i3 i1 i4 4 y ys x 1 2 3 5 i0 4 L Rasterização de Primitivas

Interseção nos vértices Computação Gráfica Interativa - Gattass 3/25/2017 Interseção nos vértices só inclui vértices de menor y: i0-i4 J só inclui vértices de maior y: i0-i1, i2-i3 J ou reta horizontal não produz interseção Rasterização de Primitivas

Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de Fill void FillPolygon (int np, int *x, int *y) { /* declarações */ . . . /* calcula y max e min dos vértices*/ for(ys=ymim; ys<=ymax; ys--) /* para cada linha de scan */ num_inters = 0; for(i=0; i<np; i++) /* para cada aresta */ yi = y[i]; yf = y[(i+1)%np]; if (yi!=yf && ys >= MIN(yi,yf) && ys < MAX(yi,yf) ) vxs[num_inters] = x[i] + (ys-yi)*(x[(i+1)%np]-x[i])/(yf-yi); num_inters++; } ordena(vxs,0,num_inters-1); /* ordena as interseções */ for (i=0;i<num_inters;i+=2) if (vxs[i]+1 <= vxs[i+1]) ScanLine(vxs[i],vxs[i+1],ys); Rasterização de Primitivas

Otimizações do algoritmo de fill Computação Gráfica Interativa - Gattass 3/25/2017 Otimizações do algoritmo de fill dx = (x1-x0)/(ymax-ymin) x (ou z) y ymin ymax ys ys+1 x1 x0 dy = 1 x = x+dx Lista de Arestas struct edge { int y_max; /* maior y da aresta */ int y_min; /* menor y da aresta */ float xs; /* x correspondente a ys */ /* (no início é o correspondente a y_max) */ float delta_xs; /* incremento de xs entre duas linhas de scan */ }; Rasterização de Primitivas

Algoritmo de Fill de Polígonos (Parte 1-Alocação de Memória) Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de Fill de Polígonos (Parte 1-Alocação de Memória) #define Max(a,b) (((a) > (b)) ? (a) : (b)) #define Min(a,b) (((a) < (b)) ? (a) : (b)) void fill (int np, int *x, int *y) { static struct edge *aresta=NULL; /* vetor de arestas */ static int *vxs=NULL; /* vetor de interseções */ static int old_np=0; /* número de pontos da última chamada */ int ymax, ymin; /* limites do polígono */ int num_inters; /* num. de interseções */ int num_arestas; /* num. de arestas */ int ys; /* ordenada da reta de scan */ int i; /* realoca os vetores de arestas e de interseções */ if (np > old_np) old_np=np; if (vxs) free (vxs); if (aresta) free (aresta); vxs=(int *) malloc ((np-1)*sizeof(int)); /* max num. De inters.*/ aresta=(struct edge *) malloc (np*sizeof(struct edge)); } /* CONTINUA NA PARTE 2 */ Rasterização de Primitivas

Algoritmo de Fill de Polígonos (Parte 2-Lista de Arestas) Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de Fill de Polígonos (Parte 2-Lista de Arestas) /* PARTE 1*/ /* calcula y max e min e monta o vetor de arestas */ ymax = y[0]; ymin = y[0]; num_arestas = 0; for(i=0;i<np;i++) { int i1=(i+1)%np; if (y[i] != y[i1]) aresta[num_arestas].y_max = Max(y[i],y[i1]); aresta[num_arestas].y_min = Min(y[i],y[i1]); aresta[num_arestas].delta = ((float)(x[i1]-x[i])/ (float)(y[i1]-y[i])); if (aresta[num_arestas].y_mim == y[i]) aresta[num_arestas].xs = x[i]; else aresta[num_arestas].xa = x[i1]; if (aresta[num_arestas].y_max > ymax) ymax = aresta[num_arestas].y_max; if (aresta[num_arestas].y_min < ymin) ymin = aresta[num_arestas].y_min; num_arestas++; } /* CONTINUA NA PARTE 3 */ Rasterização de Primitivas

Algoritmo de Fill de Polígonos (Parte 3-Varredura) Computação Gráfica Interativa - Gattass 3/25/2017 Algoritmo de Fill de Polígonos (Parte 3-Varredura) /* PARTES 1 E 2 */ for(ys=ymin; ys<ymax; ys++) /* para cada linha de scan */ { num_inters = 0; for(i=0; i<num_arestas; i++) if (aresta[i].y_max < ys){ /* retira da lista de arestas */ aresta[i] = aresta[num_arestas-1]; num_arestas--; } if((ys>=aresta[i].y_min)&&(ys<aresta[i].y_max)){ /* intersepta */ vxs[num_inters] = aresta[i].xs; aresta[i].xs += aresta[i].delta; /* atualiza o xs */ num_inters++; } /* for */ ordena(vxs,0,num_inters-1); /* ordena as interseções */ for(i=0;i<num_inters;i+=2) if (vxs[i]+1 <= vxs[i+1]) hline(vxs[i],vxs[i+1],ys,0xff); } /* fill */ /* FIM */ Rasterização de Primitivas

Ordenação no Algoritmo de Fill Computação Gráfica Interativa - Gattass 3/25/2017 Ordenação no Algoritmo de Fill static void ordena(int *vxs, int left, int right) { int i,j; int a; i = left; j = right; a = vxs[(left + right)/2]; do while (vxs[i] < a && i < right) i++; while (a < vxs[j] && j > left) j--; if (i<=j) int b = vxs[i]; vxs[i] = vxs[j]; vxs[j] = b; i++;j--; } } while (i<=j); if (left < j) ordena(vxs,left,j); if (i < right) ordena(vxs,i,right); Rasterização de Primitivas

Caso Particular: Triângulo Computação Gráfica Interativa - Gattass 3/25/2017 Caso Particular: Triângulo y A A c b B a C x Rasterização de Primitivas

Computação Gráfica Interativa - Gattass 3/25/2017 int triangleDraw( Triangle triangle ) { float xA,yA, xB,yB, xC,yC, dx1,dy1, dx2,dy2, dx3,dy3; float xLeft,yLeft, xRight,yRight; triangleGetABC( triangle, &xA, &yA, &xB, &yB, &xC, &yC ); dx1 = ( ( yB - yA ) > 0) ? ( ( xB - xA ) / ( yB - yA ) ) : 0; dx2 = ( ( yC - yA ) > 0) ? ( ( xC - xA ) / ( yC - yA ) ) : 0; dx3 = ( ( yC - yB ) > 0) ? ( ( xC - xB ) / ( yC - yB ) ) : 0; xLeft = xRight = xA; yLeft = yRight = yA; if( dx1 > dx2 ) { while( yLeft <= yB ) { horizontalLine( (int)xLeft, (int)xRight, (int)yLeft ); ++yLeft; ++yRight; xLeft += dx2; xRight += dx1; } xRight = xB; yRight = yB; while( yLeft <= yC ) { xLeft += dx2; xRight += dx3; } else { . . . return 0; Rasterização de Primitivas

Computação Gráfica Interativa - Gattass 3/25/2017 int triangleDraw( Triangle triangle ) { . . . if( dx1 > dx2 ) { while( yLeft <= yB ) { horizontalLine( (int)xLeft, (int)xRight, (int)yLeft ); ++yLeft; ++yRight; xLeft += dx2; xRight += dx1; } xRight = xB; yRight = yB; while( yLeft <= yC ) { xLeft += dx2; xRight += dx3; } else { xLeft += dx1; xRight += dx2; xLeft = xB; yLeft = yB; ++yLeft; ++yRight; xLeft += dx3; xRight += dx2; return 0; Rasterização de Primitivas

Triângulo decisão das arestas esquerda e direita Computação Gráfica Interativa - Gattass 3/25/2017 Triângulo decisão das arestas esquerda e direita y y A A A A yA yA c c b b yB yB B B a a a a yC yC C C xl xr x xl xr x Rasterização de Primitivas

Triângulo loop superior Computação Gráfica Interativa - Gattass 3/25/2017 Triângulo loop superior y y A A A A yA yA c c b b yB yB B B a a a a yC yC C C xl xr x xl xr x Rasterização de Primitivas

Triângulo loop inferior Computação Gráfica Interativa - Gattass 3/25/2017 Triângulo loop inferior y y A A A A yA yA c c b b yB yB B B a a a a yC yC C C xl xr x xl xr x Rasterização de Primitivas

Stipples, patterns e imagens Computação Gráfica Interativa - Gattass 3/25/2017 Stipples, patterns e imagens Stipple void SetPixel(int x,int y) { int i=(x-x0)%w; int j=(y-y0)%h; if (stipple[i][j]) { Pixel(x,y,foreground); } else { if (backopacity) Pixel(x,y,background); } w = 5 h = 5 Pattern void SetPixel(int x,int y) { color = pattern[(x-x0)%w][(y-y0)%h] Pixel(x,y,color); } Rasterização de Primitivas