Sie sind auf Seite 1von 3

Computação Gráfica – Teoria

ALGORITMO DE BRESENHAN

1- Line Generation : Algoritmo de Bresenham

No algoritmo apresentado nas aulas anteriores vimos que, no caso da reta possuir um
coeficiente angular m entre -1 e 1 (1 < m < 1) ou seja, inclinação menor do que 45o
(dx>=dy) deveríamos percorrer o eixo x de um em um (fazer xi+1 = xi + 1), calculando
pela equação da reta y = m.x + b o valor de y (Lembrando que se a reta tem inclinação
maior do que 45o (dx<dy) devemos fazer o mesmo só que variando y de um em um e
calculando x).

Esse método tem um custo computacional relativamente caro pois envolve operação
de multiplicação (m.x), e para complicar m é um número real. Além disso, é necessário
“arredondar” ( ROUND(y) ) o valor de y, que também é real, para transformá-lo em
inteiro.
Uma variação desse método, como vimos, é calcular o y utilizando o y anterior:
yi+1 = yi + m
De qualquer forma ainda é feito uma operação de adição entre dois números reais
(ponto flutuante) e ainda é necessário “arredondar” o valor de yi+1 ( ROUND(yi+1) ).
Algoritmo de BRESENHAM é atrativo porque ele utiliza somente aritmética inteira.
Nenhuma variável do tipo real é utilizada e dessa forma não é necessário fazer
arredondamentos. Vou apresentar o algoritmo para linhas com coeficiente angular
entre 0 e 1. Para os demais valores de coeficientes pode-se aplicar o mesmo algoritmo
com os pontos devidamente refletidos nos eixos x e y.

O algoritmo utiliza uma variável de decisão di que a cada passo é proporcional à diferença
entre s e t mostrados na figura abaixo. A figura 4.1 mostra o passo número i, onde o ponto Pi-
1 foi determinado como o mais próximo da reta real no passo anterior, e agora precisa
determinar qual dos dois pixels (Si e Ti) será ativado. Se s < t então Si é o mais próximo da
reta real e deverá ser ativado, caso contrário, Ti é que deverá ser ativado. Em resumo:
Se s-t < 0 ativar Si, senão ativar Ti

Um ponto que deve ser ressaltado é que neste algoritmo os pontos extremos de um
segmento devem ser inteiros, dessa forma deve-se fazer um arredondamento inicial nos
pontos extremos simplesmente para satisfazer esta condição.

Prof. Humberto B. Pinheiro


figura 4.1

Vamos entender agora como é definida a variável de decisão di que tem a finalidade de
determinar qual pixel deve ser ativado:
Tomemos um segmento qualquer que tem os seguintes pontos extremos (x1,y1) e
(x2,y2), sendo x1,x2,y1 e y2 são inteiros, como explicado anteriormente. Sendo dx=x2-x1
e dy=y2-y1, imaginemos que a figura 4.1 mostre apenas uma parte desse segmento e que
estamos em um determinado passo i do algoritmo de BRESENHAM. Então os pixels Pi-1 ,
Si e Ti têm as seguintes coordenadas (índices na matriz de pixels) inteiras, (r,q) , (r+1,q) e
(r+1,q+1) respectivamente.
Se a equação da reta suporte desse segmento é
y=mx+b ou melhor
y= (dy/dx).x +b (1.1)

Então a distância s (ver a figura 4.1) pode ser determinada assim:


s= y - q sendo y o valor real da função (dy/dx).x+b (ver 1.1) no ponto x=r+1
substituindo y pela equação 1.1 temos:

s = (dy/dx).(r+1) + b - q (1.2)

da mesma forma:
t = (q+1) - y
substituindo y pela equação 1.1 temos:
t = (q+1) - (dy/dx).(r+1) - b (1.3)

Assim conseguimos definir s-t (equação 1.2 - equação 1.3):


s-t = 2.(dy/dx).(r + 1) - 2.q - 1 + 2.b =>
dx.(s-t) = 2.dy.(r+1) - 2.q.dx - dx + 2.b.dx (1.4)

Prof. Humberto B. Pinheiro


** Vamos forçar dx ser maior que zero, fazendo sempre x1 < x2 . Dessa forma
podemos escolher Si se dx.(s-t)<0 ou Ti caso contrário.
Substituindo então dx.(s-t) por di em (1.4)temos:
di = 2.( r.dy - q.dx) + 2.dy - dx + 2.b.dx (1.5)

Se r = xi-1 e q = yi-1 então


di = 2.( xi-1.dy - yi-1.dx) + 2.dy - dx + 2.b.dx (1.6)
Somando 1 a todos os índices teremos:
di+1 = 2.( xi.dy - yi.dx) + 2.dy - dx + 2.b.dx (1.7)

Fazendo di+1 - di (equação 1.7 - 1.6) teremos


di+1 - di = 2.dy.( xi - xi-1 ) - 2.dx.( yi - yi-1 ) (1.8)
Como ( xi - xi-1 ) = 1 (no caso de -1< m < 1) teremos
di+1 = di + 2.dy - 2.dx.( yi - yi-1 ) (1.9)
* Se di >= 0 então ativar Ti e yi= yi-1 + 1 e
di+1 = di + 2.dy - 2.dx.( 1 ) = di + 2.(dy - dx) (** 1.91)
* Se di < 0 então ativar Si e yi= yi-1 e
di+1 = di + 2.dy - 2.dx.( 0 ) = di + 2.dy (** 1.92)
Dessa forma temos um método iterativo de calcular di+1 a partir de um valor anterior di.
Falta agora determinar o valor inicial para di ou seja d1 já que não temos o valor anterior.
Podemos definir esse valor a partir da equação 1.6 da seguinte maneira:
d1= 2.(x0.dy - y0.dx) + 2.dy - dx + 2.b.dx
como y0= (dy/dx). x0 + b (equação da reta)
Substituindo na equação anterior temos:
d1= 2.(x0.dy - ((dy/dx). x0 + b).dx) + 2.dy - dx + 2.b.dx =
d1= 2.x0.dy - 2. x0.dy - 2b.dx + 2.dy - dx + 2.b.dx =
d1= 2.dy - dx ( ** 2.0 **)

Prof. Humberto B. Pinheiro

Das könnte Ihnen auch gefallen