O algoritmo de linha de Bresenham pode ser usado para determinar quais pontos em uma grade raster devem ser plotados para obter uma aproximação visual apropriada de um segmento de linha.
O algoritmo abrange a rasterização de uma linha definida pela origem e pontos finais em um espaço de coordenadas em que a origem está no canto superior esquerdo. Presume-se que as coordenadas inteiras mapeiam para os centros de pixel. Notavelmente, a forma básica do algoritmo cobre apenas um octante do círculo: aquele em que a linha tem coordenadas X e Y crescentes, mas uma inclinação negativa com um valor absoluto menor que 1. Todos os outros octantes podem ser derivados como simples transformações desse círculo. octante básico.
No psuedocode, este formulário básico se parece com:
void DrawLine(Point origin, Point endpoint, Bitmap surface) {
deltaX = endpoint.X - origin.X
deltaY = endpoint.Y - origin.Y
error = 0
// Note the below fails for completely vertical lines.
deltaError = absoluteValue(deltaY / deltaX)
Y = origin.Y
for (X from origin.X to endpoint.X) {
surface.PlotPixel(X, Y)
error = error + deltaError
if (error >= 0.5) {
++Y;
error -= 1.0
}
}
}
O site do Código Rosetta tem uma coleção de implementações concretas em uma variedade de idiomas .
Você também pode estar interessado no algoritmo de linha de Wu , que permite anti-aliasing.