sexta-feira, 1 de maio de 2015

T1 - Função DrawLine();

DrawLine: Uma função que rasteriza uma linha na tela, recebendo como parâmetros os seus vértices (inicial e final, representados respectivamente pelas tuplas (x0,y0) e (x1,y1)), e as cores (no formato RGBA) de cada vértice. As cores dos pixeis ao longo da linha rasterizada devem ser obtidas através da interpolação linear das cores dos vértices extremos. O algoritmo de rasterização a ser implementado deve ser o algoritmo de Bresenham.

 Sabemos como rasterizar linhas com o coeficiente angular (m) entre 0 e 1 utilizando o algoritmo de Bresenham. Foi demostrado o cálculo realizado para chegar em um algoritmo que rasteriza linhas com m entre 0 e 1. Utilizando os mesmos cálculos, vamos obter o algoritmo para realizar as rasterizações em retas com o coeficiente angular fora do intervalo 0 e 1.

O algoritmo demostrado em sala rasteriza linhas nos octantes 1 e 6 (rasterização de linha no 6 é obtido por reflexão no algoritmo para o octante 1). Precisamos apenas implementar o algoritmo de Bresenham para os octantes 2, 7 e 8. Pois os demais octantes podem ser rasterizados pela reflexão dos octantes citados.

"Como realizar a reflexão?": Para obter a reflexão basta mudar o octante da linha a ser rasterizada. Os algoritmos para rasterização apenas rasteriza em octantes em que o dx > 0. Antes de inicia a rasterização bastar checar se o dx é positivo, em caso negativo, é necessário realizar a troca do P1 com o P2 (o algoritmo rasteriza do ponto P1 até o P2, onde P1 tem menor valor de coordenada X comparado a P2). Assim o octante será trocado.

Os seguintes cálculos foram obtidos:

Para o segundo octante (m > 1): O valor inicial (d) é igual a dy - 2*dx. Se o valor inicial for maior que  0, o incremento será igual a -2*dx e o pixel a ser rasterizado será o (Xc + 1, Yc), caso contrario, o incremento é igual a 2*(dy - dx) e o pixel a ser rasterizado será o (Xc + 1, Yc + 1).

Para o sétimo octante (m < -1): O valor inicial (d) é igual a dy + 2*dx. Se o valor inicial for maior que  0, o incremento será igual a 2*dx e o pixel a ser rasterizado será o (Xc + 1, Yc), caso contrario, o incremento é igual a 2*(dy + dx) e o pixel a ser rasterizado será o (Xc+ 1, Yc - 1).

Para o oitavo octante (-1 <= m < 0): O valor inicial (d) é igual a 2*dy + dx. Se o valor inicial for maior que  0, o incremento será igual a 2*dy e o pixel a ser rasterizado será o (Xc + 1, Yc - 1), caso contrario, o incremento é igual a 2*(dy + dx) e o pixel a ser rasterizado será o (Xc, Yc - 1).

Imagens:

Rasterização de linhas

Nenhum comentário:

Postar um comentário