logo

Algoritmo de Linha de Bresenham

Este algoritmo é usado para converter uma linha em varredura. Foi desenvolvido por Bresenham. É um método eficiente porque envolve apenas operações de adição, subtração e multiplicação de inteiros. Essas operações podem ser executadas muito rapidamente para que as linhas possam ser geradas rapidamente.

Neste método, o próximo pixel selecionado é aquele que possui a menor distância da linha verdadeira.

O método funciona da seguinte maneira:

Suponha um pixel P1'(x1',e1'), em seguida, selecione os pixels subsequentes à medida que avançamos até a noite, uma posição de pixel por vez na direção horizontal em direção a P2'(x2',e2').

Uma vez que um pixel é escolhido em qualquer etapa

O próximo pixel é

  1. Qualquer um à sua direita (limite inferior da linha)
  2. Um no canto superior direito e para cima (limite superior da linha)

A linha é melhor aproximada pelos pixels que ficam a menor distância do caminho entre P1',P2'.

Bresenham

Para escolher o próximo entre o pixel inferior S e o pixel superior T.
Se S for escolhido
Nós temos xeu+1=xeu+1 e vocêeu+1=seu
Se T for escolhido
Nós temos xeu+1=xeu+1 e vocêeu+1=seu+1

As coordenadas y reais da linha em x = xeu+1é
y=mxeu+1+b

Bresenham

A distância de S até a linha real na direção y
s = aaeu

A distância de T até a linha real na direção y
t = (seu+1)-s

assistente do comissário de polícia

Agora considere a diferença entre esses 2 valores de distância
s-t

Quando (s-t)<0 ⟹ s < t< p>

O pixel mais próximo é S

Quando (st) ≧0 ⟹ s

O pixel mais próximo é T

Essa diferença é
st = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Substituindo m por Bresenhame introduzindo variável de decisão
deu= △x (st)
deu=△x (2 Bresenham(xeu+1)+2b-2yeu-1)
=2△xyeu-2△y-1△x.2b-2yeu△x-△x
deu=2△y.xeu-2△x.yeu+c

Onde c= 2△y+△x (2b-1)

Podemos escrever a variável de decisão deu+1para o próximo deslizamento
deu+1=2△y.xeu+1-2△x.yeu+1+c
deu+1-deu=2△y.(xeu+1-xeu)- 2△x(yeu+1-eeu)

Como x_(i+1)=xeu+1, temos
deu+1+deu=2△y.(xeu+1-xeu)- 2△x(yeu+1-eeu)

Casos especiais

Se o pixel escolhido estiver no pixel superior T (ou seja, deu≧0)⟹ eeu+1=seu+1
deu+1=deu+2△y-2△x

Se o pixel escolhido estiver no pixel inferior T (ou seja, deu<0)⟹ yeu+1=yeu
deu+1=deu+2△y

Finalmente, calculamos d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+por1)+2m-1]

Desde mx1+poreu=0 e m = , Nós temos
d1=2△y-△x

Vantagem:

1. Envolve apenas aritmética inteira, por isso é simples.

2. Evita a geração de pontos duplicados.

3. Pode ser implementado em hardware porque não utiliza multiplicação e divisão.

4. É mais rápido em comparação com DDA (Digital Differential Analyzer) porque não envolve cálculos de ponto flutuante como o Algoritmo DDA.

Desvantagem:

1. Este algoritmo destina-se apenas ao desenho de linha básico. A inicialização não faz parte do algoritmo de linha de Bresenham. Portanto, para desenhar linhas suaves, você deve procurar um algoritmo diferente.

Algoritmo de linha de Bresenham:

Passo 1: Iniciar Algoritmo

Passo 2: Declarar variável x1,x2,e1,e2,d,eu1,eu2,dx,dy

Etapa 3: Insira o valor de x1,e1,x2,e2
Onde x1,e1são coordenadas do ponto de partida
E x2,e2são coordenadas do ponto final

Passo 4: Calcular dx = x2-x1
Calcule dy = y2-e1
Calcule eu1=2*você
Calcule eu2=2*(dy-dx)
Calcule d = eu1-dx

Etapa 5: Considere (x, y) como ponto de partida e xfimcomo valor máximo possível de x.
Se dx<0
Então x = x2
s = s2
xfim=x1
Se dx > 0
Então x = x1
s = s1
xfim=x2

Etapa 6: Gere ponto nas coordenadas (x,y).

Etapa 7: Verifique se a linha inteira foi gerada.
Se x > = xfim
Parar.

Etapa 8: Calcule as coordenadas do próximo pixel
Se d<0
Então d = d + eu1
Se d ≧ 0
Então d = d + eu2
Incremento y = y + 1

Etapa 9: Incremento x = x + 1

Etapa 10: Desenhe um ponto das últimas coordenadas (x, y)

Etapa 11: Vá para a etapa 7

Etapa 12: Fim do Algoritmo

Exemplo: As posições inicial e final da linha são (1, 1) e (8, 5). Encontre pontos intermediários.

Solução: x1=1
e1=1
x2=8
e2=5
dx = x2-x1=8-1=7
você = você2-e1=5-1=4
EU1=2* ∆y=2*4=8
EU2=2*(∆y-∆x)=2*(4-7)=-6
d = eu1-∆x=8-7=1

x e d = d + eu1ou eu2
1 1 d + eu2=1+(-6)=-5
2 2 d + eu1=-5+8=3
3 2 d + eu2=3+(-6)=-3
4 3 d + eu1=-3+8=5
5 3 d + eu2=5+(-6)=-1
6 4 d + eu1=-1+8=7
7 4 d + eu2=7+(-6)=1
8 5

Programa para implementar o algoritmo de desenho de linha de Bresenham:

 #include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&amp;gdriver, &amp;gmode, &apos;c:\turboc3\bgi&apos;); printf(&apos;Enter co-ordinates of first point: &apos;); scanf(&apos;%d%d&apos;, &amp;x0, &amp;y0); printf(&apos;Enter co-ordinates of second point: &apos;); scanf(&apos;%d%d&apos;, &amp;x1, &amp;y1); drawline(x0, y0, x1, y1); return 0; } 

Saída:


Diferencie entre Algoritmo DDA e Algoritmo de Linha de Bresenham:

Algoritmo DDA Algoritmo de Linha de Bresenham
1. O algoritmo DDA usa ponto flutuante, ou seja, aritmética real. 1. O algoritmo de linha de Bresenham usa ponto fixo, ou seja, aritmética de inteiros
2. Algoritmos DDA usam multiplicação e divisão para sua operação 2. O algoritmo de linha de Bresenham usa apenas subtração e adição em sua operação
3. O algoritmo DDA é mais lento que o algoritmo de linha de Bresenham no desenho de linha porque usa aritmética real (operação de ponto flutuante) 3. O Algoritmo de Bresenham é mais rápido que o Algoritmo DDA em linha porque envolve apenas adição e subtração em seu cálculo e usa apenas aritmética inteira.
4. O algoritmo DDA não é preciso e eficiente como o algoritmo de linha de Bresenham. 4. O algoritmo de linha de Bresenham é mais preciso e eficiente no algoritmo DDA.
5. O algoritmo DDA pode desenhar círculos e curvas, mas não é preciso como o algoritmo de linha de Bresenham 5. O algoritmo de linha de Bresenham pode desenhar círculos e curvas com mais precisão do que o algoritmo DDA.

função de protótipo c++