Algoritmo de Geração de Linha

Uma linha conecta dois pontos. É um elemento básico em gráficos. Para desenhar uma linha, você precisa de dois pontos entre os quais você pode desenhar uma linha. Nos três algoritmos a seguir, nos referimos a um ponto da linha como $ X_ {0}, Y_ {0} $ e o segundo ponto da linha como $ X_ {1}, Y_ {1} $.

Algoritmo DDA

O algoritmo Digital Differential Analyzer (DDA) é o algoritmo de geração de linha simples que é explicado passo a passo aqui.

Step 1 - Obtenha a entrada de dois pontos finais $ (X_ {0}, Y_ {0}) $ e $ (X_ {1}, Y_ {1}) $.

Step 2 - Calcule a diferença entre dois pontos finais.

dx = X1 - X0
dy = Y1 - Y0

Step 3- Com base na diferença calculada na etapa 2, você precisa identificar o número de etapas para colocar o pixel. Se dx> dy, então você precisa de mais etapas na coordenada x; caso contrário, na coordenada y.

if (absolute(dx) > absolute(dy))
   Steps = absolute(dx);
else
   Steps = absolute(dy);

Step 4 - Calcular o incremento na coordenada xey coordenada y.

Xincrement = dx / (float) steps;
Yincrement = dy / (float) steps;

Step 5 - Coloque o pixel incrementando com sucesso as coordenadas xey de acordo e conclua o desenho da linha.

for(int v=0; v < Steps; v++)
{
   x = x + Xincrement;
   y = y + Yincrement;
   putpixel(Round(x), Round(y));
}

Linha Geração de Bresenham

O algoritmo de Bresenham é outro algoritmo de conversão de varredura incremental. A grande vantagem desse algoritmo é que ele usa apenas cálculos inteiros. Movendo-se ao longo do eixo x em intervalos de unidades e em cada etapa, escolha entre duas coordenadas y diferentes.

Por exemplo, conforme mostrado na ilustração a seguir, na posição (2, 3) você precisa escolher entre (3, 3) e (3, 4). Você gostaria de ver o ponto mais próximo da linha original.

Na posição de amostra $ X_ {k} + 1, $ as separações verticais da linha matemática são rotuladas como $ d_ {superior} $ e $ d_ {inferior} $.

Da ilustração acima, a coordenada y na linha matemática em $ x_ {k} + 1 $ é -

Y = m ($ X_ {k} $ + 1) + b

Assim, $ d_ {superior} $ e $ d_ {inferior} $ são dados da seguinte forma -

$$ d_ {lower} = y-y_ {k} $$

$$ = m (X_ {k} + 1) + b - Y_ {k} $$

e

$$ d_ {superior} = (y_ {k} + 1) - y $$

$ = Y_ {k} + 1 - m (X_ {k} + 1) - b $

Você pode usá-los para tomar uma decisão simples sobre qual pixel está mais próximo da linha matemática. Esta decisão simples é baseada na diferença entre as duas posições de pixel.

$$ d_ {inferior} - d_ {superior} = 2m (x_ {k} + 1) - 2a_ {k} + 2b - 1 $$

Vamos substituir m por dy / dx onde dx e dy são as diferenças entre os pontos finais.

$$ dx (d_ {inferior} - d_ {superior}) = dx (2 \ frac {\ mathrm {d} y} {\ mathrm {d} x} (x_ {k} + 1) - 2y_ {k} + 2b - 1) $$

$$ = 2dy.x_ {k} - 2dx.y_ {k} + 2dx + 2dx (2b-1) $$

$$ = 2dy.x_ {k} - 2dx.y_ {k} + C $$

Assim, um parâmetro de decisão $ P_ {k} $ para o k- ésimo passo ao longo de uma linha é dado por -

$$ p_ {k} = dx (d_ {inferior} - d_ {superior}) $$

$$ = 2dy.x_ {k} - 2dx.y_ {k} + C $$

O sinal do parâmetro de decisão $ P_ {k} $ é o mesmo que $ d_ {inferior} - d_ {superior} $.

Se $ p_ {k} $ for negativo, então escolha o pixel inferior, caso contrário, escolha o pixel superior.

Lembre-se de que as mudanças de coordenadas ocorrem ao longo do eixo x em etapas unitárias, então você pode fazer tudo com cálculos inteiros. Na etapa k + 1, o parâmetro de decisão é dado como -

$$ p_ {k +1} = 2dy.x_ {k + 1} - 2dx.y_ {k + 1} + C $$

Subtraindo $ p_ {k} $ disto obtemos -

$$ p_ {k + 1} - p_ {k} = 2dy (x_ {k + 1} - x_ {k}) - 2dx (y_ {k + 1} - y_ {k}) $$

Mas, $ x_ {k + 1} $ é o mesmo que $ (xk) + 1 $. Então -

$$ p_ {k + 1} = p_ {k} + 2dy - 2dx (y_ {k + 1} - y_ {k}) $$

Onde, $ Y_ {k + 1} - Y_ {k} $ é 0 ou 1 dependendo do sinal de $ P_ {k} $.

O primeiro parâmetro de decisão $ p_ {0} $ é avaliado em $ (x_ {0}, y_ {0}) $ é dado como -

$$ p_ {0} = 2dy - dx $$

Agora, tendo em mente todos os pontos e cálculos acima, aqui está o algoritmo de Bresenham para inclinação m <1 -

Step 1 - Insira os dois pontos finais da linha, armazenando o ponto final esquerdo em $ (x_ {0}, y_ {0}) $.

Step 2 - Trace o ponto $ (x_ {0}, y_ {0}) $.

Step 3 - Calcule as constantes dx, dy, 2dy e (2dy - 2dx) e obtenha o primeiro valor para o parâmetro de decisão como -

$$ p_ {0} = 2dy - dx $$

Step 4 - A cada $ X_ {k} $ ao longo da linha, começando em k = 0, execute o seguinte teste -

Se $ p_ {k} $ <0, o próximo ponto a traçar é $ (x_ {k} +1, y_ {k}) $ e

$$ p_ {k + 1} = p_ {k} + 2dy $$ Caso contrário,

$$ (x_ {k}, y_ {k} +1) $$

$$ p_ {k + 1} = p_ {k} + 2dy - 2dx $$

Step 5 - Repita o passo 4 (dx - 1) vezes.

Para m> 1, descubra se você precisa incrementar x enquanto incrementa y a cada vez.

Depois de resolver, a equação para o parâmetro de decisão $ P_ {k} $ será muito semelhante, apenas o xey na equação são trocados.

Algoritmo de Ponto Médio

O algoritmo do ponto médio é devido a Bresenham que foi modificado por Pitteway e Van Aken. Suponha que você já tenha colocado o ponto P na coordenada (x, y) e a inclinação da reta seja 0 ≤ k ≤ 1, conforme mostrado na ilustração a seguir.

Agora você precisa decidir se colocar o próximo ponto em E ou N. Isso pode ser escolhido identificando o ponto de interseção Q mais próximo do ponto N ou E. Se o ponto de interseção Q estiver mais próximo do ponto N, então N é considerado como o próximo ponto; caso contrário, E.

Para determinar isso, primeiro calcule o ponto médio M (x + 1, y + ½). Se o ponto de interseção Q da linha com a linha vertical conectando E e N estiver abaixo de M, considere E como o próximo ponto; caso contrário, tome N como o próximo ponto.

Para verificar isso, precisamos considerar a equação implícita -

F (x, y) = mx + b - y

Para m positivo em qualquer X dado,

  • Se y estiver na linha, então F (x, y) = 0
  • Se y estiver acima da linha, então F (x, y) <0
  • Se y estiver abaixo da linha, então F (x, y)> 0