function [x,y] = intline(x1, x2, y1, y2)
%INTLINE Integer-coordinate line drawing algorithm.
%   [X, Y] = INTLINE(X1, X2, Y1, Y2) computes an
%   approximation to the line segment joining (X1, Y1) and
%   (X2, Y2) with integer coordinates.  X1, X2, Y1, and Y2
%   should be integers.  INTLINE is reversible; that is,
%   INTLINE(X1, X2, Y1, Y2) produces the same results as
%   FLIPUD(INTLINE(X2, X1, Y2, Y1)).
%
%   Function adapted from the 'strel' function of matlab.
%

dx = abs(x2 - x1);
dy = abs(y2 - y1);

% Check for degenerate case
if dx == 0 && dy == 0
    x = x1;
    y = y1;
    return;
end

flip = 0;
if dx >= dy
    if x1 > x2
        % swap coordinates to draw from left to right.
        t = x1; x1 = x2; x2 = t;
        t = y1; y1 = y2; y2 = t;
        flip = 1;
    end
    
    % compute line slope, and y from x
    m = (y2 - y1) / (x2 - x1);
    x = (x1:x2).';
    y = round(y1 + m * (x - x1));
    
else
    if y1 > y2
        % swap coordinates to draw from bottom to top.
        t = x1; x1 = x2; x2 = t;
        t = y1; y1 = y2; y2 = t;
        flip = 1;
    end
    
    % compute line slope, and x from y
    m = (x2 - x1) / (y2 - y1);
    y = (y1:y2).';
    x = round(x1 + m * (y - y1));
end

if flip
    x = flipud(x);
    y = flipud(y);
end

