desenho de primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoprimitivas.pdf · desenho de um...

11
Desenho de Primitvas Prof. Leandro Tonietto Baseada na apresentação do Prof. João Ricardo Bittencourt Atualizada em: 08/05/2013 [email protected] Processamento Gráfico - UNISINOS 1

Upload: others

Post on 13-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

Desenho de Primitvas

Prof. Leandro Tonietto !

Baseada na apresentação do Prof. João Ricardo Bittencourt !

Atualizada em: 08/05/2013 [email protected]

Processamento Gráfico - UNISINOS

1

Page 2: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

Sumário

! Base: ponto e linha ! Algoritmo genérico de linha Bresenhan ! Retângulo ! Elipse e formas curvas ! Polígono qualquer

2

Page 3: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 4: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 5: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 6: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 7: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 8: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 9: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 10: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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

Page 11: Desenho de Primitvasprofessor.unisinos.br/ltonietto/jed/pgr/desenhoPrimitivas.pdf · Desenho de um ponto! A primitiva mais simples para desenho é o ponto. ! Requer apenas uma posição

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