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 é
- Qualquer um à sua direita (limite inferior da linha)
- 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'.
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
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 é Substituindo m por e introduzindo variável de decisão Onde c= 2△y+△x (2b-1) Podemos escrever a variável de decisão deu+1para o próximo deslizamento Como x_(i+1)=xeu+1, temos Casos especiais Se o pixel escolhido estiver no pixel superior T (ou seja, deu≧0)⟹ eeu+1=seu+1 Se o pixel escolhido estiver no pixel inferior T (ou seja, deu<0)⟹ yeu+1=yeu Finalmente, calculamos d1 Desde mx1+poreu=0 e m = , Nós temos 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. 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. 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 Passo 4: Calcular dx = x2-x1 Etapa 5: Considere (x, y) como ponto de partida e xfimcomo valor máximo possível de x. Etapa 6: Gere ponto nas coordenadas (x,y). Etapa 7: Verifique se a linha inteira foi gerada. Etapa 8: Calcule as coordenadas do próximo pixel 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 Saída:
st = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
deu= △x (st)
deu=△x (2 (xeu+1)+2b-2yeu-1)
=2△xyeu-2△y-1△x.2b-2yeu△x-△x
deu=2△y.xeu-2△x.yeu+c
deu+1=2△y.xeu+1-2△x.yeu+1+c
deu+1-deu=2△y.(xeu+1-xeu)- 2△x(yeu+1-eeu)
deu+1+deu=2△y.(xeu+1-xeu)- 2△x(yeu+1-eeu)
deu+1=deu+2△y-2△x
deu+1=deu+2△y0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+por1)+2m-1]
d1=2△y-△xVantagem:
Desvantagem:
Algoritmo de linha de Bresenham:
Onde x1,e1são coordenadas do ponto de partida
E x2,e2são coordenadas do ponto final
Calcule dy = y2-e1
Calcule eu1=2*você
Calcule eu2=2*(dy-dx)
Calcule d = eu1-dx
Se dx<0
Então x = x2
s = s2
xfim=x1
Se dx > 0
Então x = x1
s = s1
xfim=x20>
Se x > = xfim
Parar.
Se d<0
Então d = d + eu1
Se d ≧ 0
Então d = d + eu2
Incremento y = y + 10>
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(&gdriver, &gmode, 'c:\turboc3\bgi'); printf('Enter co-ordinates of first point: '); scanf('%d%d', &x0, &y0); printf('Enter co-ordinates of second point: '); scanf('%d%d', &x1, &y1); drawline(x0, y0, x1, y1); return 0; }
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++