73 lines
2.7 KiB
ObjectPascal
73 lines
2.7 KiB
ObjectPascal
procedure drawLine (bitmap : TBitmap; xStart, yStart, xEnd, yEnd : integer; color : TAlphaColor);
|
|
// Bresenham's Line Algorithm. Byte, March 1988, pp. 249-253.
|
|
// Modified from http://www.efg2.com/Lab/Library/Delphi/Graphics/Bresenham.txt and tested.
|
|
var
|
|
a, b : integer; // displacements in x and y
|
|
d : integer; // decision variable
|
|
diag_inc : integer; // d's increment for diagonal steps
|
|
dx_diag : integer; // diagonal x step for next pixel
|
|
dx_nondiag : integer; // nondiagonal x step for next pixel
|
|
dy_diag : integer; // diagonal y step for next pixel
|
|
dy_nondiag : integer; // nondiagonal y step for next pixel
|
|
i : integer; // loop index
|
|
nondiag_inc: integer; // d's increment for nondiagonal steps
|
|
swap : integer; // temporary variable for swap
|
|
x,y : integer; // current x and y coordinates
|
|
begin
|
|
x := xStart; // line starting point}
|
|
y := yStart;
|
|
// Determine drawing direction and step to the next pixel.
|
|
a := xEnd - xStart; // difference in x dimension
|
|
b := yEnd - yStart; // difference in y dimension
|
|
// Determine whether end point lies to right or left of start point.
|
|
if a < 0 then // drawing towards smaller x values?
|
|
begin
|
|
a := -a; // make 'a' positive
|
|
dx_diag := -1
|
|
end
|
|
else
|
|
dx_diag := 1;
|
|
|
|
// Determine whether end point lies above or below start point.
|
|
if b < 0 then // drawing towards smaller x values?
|
|
begin
|
|
b := -b; // make 'a' positive
|
|
dy_diag := -1
|
|
end
|
|
else
|
|
dy_diag := 1;
|
|
// Identify octant containing end point.
|
|
if a < b then
|
|
begin
|
|
swap := a;
|
|
a := b;
|
|
b := swap;
|
|
dx_nondiag := 0;
|
|
dy_nondiag := dy_diag
|
|
end
|
|
else
|
|
begin
|
|
dx_nondiag := dx_diag;
|
|
dy_nondiag := 0
|
|
end;
|
|
d := b + b - a; // initial value for d is 2*b - a
|
|
nondiag_inc := b + b; // set initial d increment values
|
|
diag_inc := b + b - a - a;
|
|
for i := 0 to a do
|
|
begin /// draw the a+1 pixels
|
|
drawPixel (bitmap, x, y, color);
|
|
if d < 0 then // is midpoint above the line?
|
|
begin // step nondiagonally
|
|
x := x + dx_nondiag;
|
|
y := y + dy_nondiag;
|
|
d := d + nondiag_inc // update decision variable
|
|
end
|
|
else
|
|
begin // midpoint is above the line; step diagonally}
|
|
x := x + dx_diag;
|
|
y := y + dy_diag;
|
|
d := d + diag_inc
|
|
end;
|
|
end;
|
|
end;
|