desenho de primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoprimitivas.pdf · desenho de um...
Post on 13-Jul-2020
2 Views
Preview:
TRANSCRIPT
Desenho de Primitvas
Prof. Leandro Tonietto !
Baseada na apresentação do Prof. João Ricardo Bittencourt !
Atualizada em: 08/05/2013 ltonietto@unisinos.br
Processamento Gráfico - UNISINOS
1
Sumário
! Base: ponto e linha ! Algoritmo genérico de linha Bresenhan ! Retângulo ! Elipse e formas curvas ! Polígono qualquer
2
Introdução
! Para desenho de primitivas podemos utilizar comandos das bibliotecas e linguagens, que desenham as primitivas na tela
! Podemos também representar as primitivas no SRU definido no OpenGL, utilizando as primitivas de desenho (GL_POINTS, GL_LINES, GL_TRIANGLES, GL_QUADS, GL_POLYGON, ...) e passando véritices (glVertex2f)
! Ou podemos desenhar manualmente na tela ou numa imagem que representa a viewport. " Neste, o qual estamos interessados nesta aula, vamos
preencher pontos de uma imagem, ou melhor, definir pixels que deve ser preenchidos com alguma cor.
3
Desenho de um ponto
! A primitiva mais simples para desenho é o ponto.
! Requer apenas uma posição no espaço: x e y, portanto, o vértice/ponto p1.
! Seguindo a ideia de desenho de primitivas em imagem, temos o comando setPixel ou o comando putPixel para definir a cor de um determinado pixel, representado pelo ponto p1. Assim: putPixel(int x, int y, int cor){ pixels[x + y*width] = cor; }
p1
x
y
4
Desenho de uma linha
! A linha também é um primitiva simples, que é definida por dois pontos: p1 e p2.
! A linha pode ser desenhada de maneira trivial se estiver alinhada a um dos eixos:drawLine(int x1,int y1,int x2,int y2, int cor){ if(x1 == x2){ for(int i=y1; i<y2; i++) putPixel(x1, i); } else if(y1 == y2){ for(int i=x1; i<x2; i++) putPixel(i, y1); } else { bresenham(x1, y1, x2, y2); } }
p1
x1
y1, y2
x2
Quando os pontos não estão alinhados é necessário um algoritmo mais complexo. O mais famoso é o Bresenham.
p2
p2p1
5
Desenho de uma linha - Bresenham
! Proposto por Jack Bresenham em 1962. ! Algoritmo clássico para desenhar uma linha
em um espaço 2D. " Reta contínua em eixos discretos
! Um dos primeiros algoritmos propostos na Computação Gráfica
! Parte da ideia de desenhar um ponto, incrementando em ambas as coordenadas e corrigindo o erro de incremento.
6
Desenho de uma linha - Bresenham
! Algoritmo: bresenham(Ponto p1, Ponto p2){ int dx = abs(p2.x-p1.x) int dy = abs(p2.y-p1.y) float erro = 0 float d = dy/dx int y = p1.y para cada x de p1.x ate p2.x faça pinta o ponto(x,y) erro = erro + d se erro >= 0.5 entao y = y+1 erro = erro - 1.0 }
7
Desenho de uma linha - Bresenham
! Alguns pontos a serem considerados: " O algoritmo não é legal para linhas alinhadas aos
eixos, nestes casos é melhor utilizar o for simples. Assim como posto no slide 5.
" Este algoritmo possui quatro variantes, dependendo da “ordem” dos pontos e do sentido da linha (são quatro direções possíveis) • Neste sentido, é possível diminuir para dois casos
invertendo a ordem dos pontos, se for o caso. " O algoritmo de desenho de linhas pode ser
utilizado para desenho do contorno de qualquer outra primitiva geométrica que pode ser reduzida a um polígono.
8
Desenho de Retângulo
! O desenho de retângulo requer apenas dois pontos: o ponto mínimo e o ponto máximo.
! Dois for’s são suficientes para desenhar um retângulo alinhado aos eixos. " Se o retângulo estiver rotacionado, então utilizar algoritmo de
desenho de polígono qualquer. " Algoritmo de retângulo alinhamento aos eixos:drawRect(int x1, int y1, int x2, int y2, cor){ for(int y=y1; y<y2; y++){ putPixel(x1, y, cor); putPixel(x2, y, cor); } for(int x=x1; x<x2; x++){ putPixel(x, y1, cor); putPixel(x, y2, cor); } }
desenha linhas verticais
desenha linhas horizontais
9
Desenho de Polígono Qualquer
! Um polígono é formado por vários segmentos de reta, também chamados de arestas.
! Para desenhar um polígono basta desenhar (algoritmo drawLine) para cada dois vértices do polígonos " Algoritmo: drawPolygon(Point *pol, int n, int cor){ for(int i=0; i<n-1; i++){ drawLine(pol[i].x, pol[i].y, pol[i+1].x, pol[i+1].y, cor); } // é necessário ligar o último vértice // com o primeiro drawLine(pol[n-1].x, pol[n-1].y, pol[0].x, pol[0].y, cor); }
1
0
2
3
4
56
10
Desenho de Elipse
! Elipse pode ser pode ser desenhada como um polígono qualquer, porém os pontos não são informados pelo usuários, eles são calculados com base nos raios (a e b) e o centro/posição da elipse. " Algortimo: #define PI 3.1415926535898 drawEllipse(int n, int cx, int cy, int rx, int ry,int cor){ float inc = 1/n; int j=0; Point *pol = new Point[n]; for (float i = 0; i < 1; i += inc) { angle = 2*PI*i; pol[j].x = cos(angle)*raioX+cx; pol[j].y = sin(angle)*raioY+cy; j++; } drawPolygon(pol, n, cor); }
34 2
1
0
5
6
7
8 910
11
top related