Rasterização de linhas e polígonos

Slides:



Advertisements
Apresentações semelhantes
Visualização do OpenGL
Advertisements

Continuidade: sem interrupções
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,
Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Prof.ª Claudia Boeres 2009/1.
Simetria.
Distâncias.
Computação Gráfica I Conteúdo: Professor:
Conceitos e Propriedades
Programação Orientada a Objetos – Parte II
Funções em C.
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro.
Aula 02.
Aula 02 continuação.
Termologia.
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 9.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 7.
Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 11.
Dispositivos de Visualização e Rasterização
Introdução à Computação - Jorge Macêdo
PREDIÇÃO DATA MINING AULA 13 SANDRA DE AMO
Percurso não recursivo e impressão em árvores binárias Drozdek.
1 Estruturas de Controle Márcia J. N. Rodrigues Lucena Especialização em Técnicas e Ferramentas de Apoio à Decisão Departamento.
Algoritmos de Varrimento para Desenho de Primitivas 2D
Recorte e seleção de linhas e polígonos
Rasterização de linhas e polígonos
Linha de produção de imagens com o OpenGL™ (OpenGL Rendering Pipeline)
Os desenhos.
FILAS (Queues) Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada; Estrutura FIFO (First In First.
Ponteiros em C.
Teoria e Método em Geoprocessamento. Exercícios.
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
Computação Gráfica: Aula5: Rendering e Rasterização
Vetores (2) Continuação.
Sintaxe de Fortran 25/abril/2006. Comandos Fortran PROGRAM PRINT READ STOP END.
Estrutura de repetição 18/set. Uso Foi construído o problema de ler notas de um aluno e fazer média. E para 5 alunos ????
MÉTRICA ds2=dx2+dy2 Distância entre dois pontos numa superfície
Exp_P160_00hzCI. sim_P160_00hz exp_P160_45hz sim_P120_20hz.
Teste Estrutural de Software
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo III Comandos de Controle.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo VII Variáveis Indexadas Numéricas.
Função Gráficos. Domínio e imagem no gráfico.
Curso Técnico em Informática La Salle - Canoas
Já definimos o coeficiente angular de uma curva y = f(x) no ponto onde x = x 0. Derivadas Chamamos esse limite, quando ele existia, de derivada de f em.
Recursividade Estrutura de Dados.
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Curso de Programação em C++
Visão Computacional Shape from Shading e Fotométrico Eséreo
Computação Gráfica - LM
OpenGL Computação Gráfica. O que é OpenGL? Uma linguagem de programação gráfica de baixo nível Projetada para gráfico interativo 2D e 3D Uma interface.
8. Uma Função de duas Variáveis Aleatórias
Introdução à Programação: uma Abordagem Funcional Programação I Engenharia de Computação Professores Claudia Boeres e Estefhan Dazzi Wandekoken 2010/1.
Vetor de Ponteiros Exemplo de Alocação. Escrever Vetor de Vetores de floats int main() { int i, k, n; float **vetor; // vetor de vetores int *tamanho;
Aplicações com FPGA Aula 10
Transformações Geométricas
Resoluções de equações Métodos iterativos
Exercicios de revisão Exercicio tirados de
Estrutura de dados II 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.
Compilação de Linguagens OO Marco Simões (macs3) André Santos (alms)
Curva de Remanso Direct Step Method.
 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.
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
INF 1366 – Computação Gráfica Interativa Rasterização
Organização do Ambiente de Execução para Linguagens OO Objeto: –Grupo de variáveis de instância, aos quais métodos de instância estão atachados; Variável.
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

Algoritmos de rasterização de linhas Computação Gráfica Interativa - Gattass 3/26/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) yi = m xi + b onde: m = Dy/Dx b = y1 - m x1 void Line(int x1, int y1, int x2, int y2, int color) { float m = (y2-y1)/(x2-x1); float b = y1 - m*x1; float y; SetPixel(x1,y1, color); y = y1; while( x1 < x2 ) x1++; y = m*x1 + b; SetPixel(x1,ROUND(y), color); }

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); }

Algoritmo de linha baseado no erro void BresLine0(int x1, int y1, int x2, int y2, int c) { int Dx = x2 - x2; 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

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

Equação implícita da reta y y2 y1 x x1 x2 E NE xp xp+1 xp+2 yp M yp+1/2

Algoritmo do ponto médio - variável de decisão - NE xp xp+1 xp+2 yp M yp+1/2 yp+3/2 MNE ME E NE

Algoritimo do ponto médio - redução para inteiros -

Algoritimo do ponto médio - código C - void MidpointLine(int x0, int y0, int x1, int y1, int color) { int dx = x1-x0; int dy = y1-y0; int d=2*dy-dx; /* Valor inicial da var. decisao */ int incrE = 2*dy; /* incremento p/ mover E */ int incrNE = 2*(dy-dx); /* incremento p/ mover NE */ int x=x0; int y=y0; Pixel(x,y,fgcolor); /* Primeiro pixel */ while (x<xl) { if (d<=0) { /* Escolha E */ d+=incrE; x++; } else { /* Escolha NE */ d+=incrNE; y++; } Pixel(x,y,color); } /* while */ } /* MidpointLine */

Estilos de linha Pixel(x,y,fgcolor)} void MidpointLine(int x0, int y0, int x1, int y1, int color) { int dx = x1-x0; int dy = y1-y0; int d=2*dy-dx; /* Valor inicial da var. decisao */ int incrE = 2*dy; /* incremento p/ mover E */ int incrNE = 2*(dy-dx); /* incremento p/ mover NE */ int x=x0; int y=y0; int style[8]={1,1,0,0,1,1,0,0}; int k=1; Pixel(x,y,fgcolor)} while (x<xl) { if (d<=0) { /* Escolha E */ d+=incrE; x++; } else { /* Escolha NE */ d+=incrNE; y++; } if (style[(++k)%8]) Pixel(x,y,color); } /* while */ } /* MidpointLine */

Rasterização de Retas -caso geral- y 1 2 2 x y 1 x orientação outros quadrantes

Rasterização de Cônicas Computação Gráfica Interativa - Gattass 3/26/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/26/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/26/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/26/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 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

Computação Gráfica Interativa - Gattass 3/26/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/26/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) #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 */

Algoritmo de Fill de Polígonos (Parte 2-Lista de Arestas) /* 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 */

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 */

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);

Caso Particular: Triângulo y A c b B a C x

Stipples, patterns e imagens Computação Gráfica Interativa - Gattass 3/26/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