Rasterizando
Olá! Neste post irei explicar como fiz o exercício 1 da disciplina de Computação Gráfica com o Professor Christian. Nesse exercício foram pedidas três funções que deveriam ser implementadas utilizando o framework oferecido pelo professor:
- Implementar a função putPixel
- Implementar a função drawLine
- Implementar a função drawTriangle
1. putPixel
A função putPixel faz nada mais do que pintar um pixel na tela de alguma cor. Para isso, ela escreve o RGBA do pixel na memória de video. Os parâmetros da função são: as coordenadas de tela(x,y) do pixel que se deseja pintar e a cor desejada do pixel.
Para facilitar os testes e diminuir a quantidade de parâmetros, criei um struct color, que vai armazenar algumas cores que serão utilizadas.
Utilizando o framework, podemos simular a escrita em memória, que não é possível nos SO's atuais. Para isso, precisamos calcular a posição em memória na qual escreveremos o pixel. Utilizamos a fórmula:
4*x + 4*y*IMAGE_WIDTH
Que utiliza 4 bytes por pixel, sendo cada byte o valor de R,G,B,A.
O resultado para quatro pixels de cores diferentes é este:
2. drawLine
A função drawLine é um pouco mais complexa. Ela receberá as coordenadas(x,y) de dois pontos e duas cores, e terá que desenhar uma linha indo do primeiro ao segundo ponto. Essa função utilizará o algoritmo de Bresehan.
No algoritmo visto em sala, pode-se desenhar um linha contida no 1º octante, ou seja, que está entre 0º e 45º graus.
No primeiro octante o d é dado por d= 2*dy - dx, e o algoritmo terá que decidir a direção leste e nordeste.
Com o primeiro octante funcionando, temos agora que generalizar o algoritmo para os outros quadrantes. Se observarmos a fórmula de d e os octantes podemos perceber algumas coisas:
- Em alguns octantes, o valor de x será incrementado ou decrementado de modo fixo e o valor de y terá que ser calculado. Esse é o caso dos 1º,4º,5º e 8º octantes.
- Em outros, o valor de y será incrementado ou decrementado de modo fixo e o valor de x terá que ser calculado. Esse é o caso dos 2º,3º,6º, e 7º octantes.
- A direção que cada octante usará vai ser diferente.
Com isso chegamos ao seguinte resultado:
Para o segundo octante o d é dado por d = dy - 2*dx e as direções são norte e nordeste.
Para o terceiro octante o d é dado por d = - dy - 2*dx e as direções são norte e noroeste.
Para o quarto octante o d é dado por d = -2*dy - dx e as direções são norte e noroeste.
Para obter o algoritmo para os quinto, sexto, sétimo e oitavo octantes basta apenas fazer a reflexão dos outros octantes já obtidos.
Com linhas em todas as direções, obtemos o seguinte resultado:
3.drawTriangle
A função drawTriangle recebe como parametros três pontos nas coordenadas (x,y) e suas respectivas cores. E traça o contorno de um triângulo.
Para construir a função, teremos que chamar a função drawLine três vezes, entre os três pontos: (x1,y1) e (x2,y2), (x2,y2) e (x3,y3) e (x3,y3) e (x1,y1).
O resultado é o seguinte:
Comentários adicionais
- Não consegui terminar o algoritmo de interpolação de cores.
Referências
- FOLEY, JAMES. D. - Computer Graphics: Principles and Practice in C. 2nd Edition: Addison-Wesley, 1990.
- Notas de aula do Prof Christian Pagot
- Blog de Fleig ( Para instalar o FreeGlut no Windows)




