quarta-feira, 22 de fevereiro de 2017

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:


  1. Implementar a função putPixel
  2. Implementar a função drawLine
  3. 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)