'Brensenham line algorithm
cribbed from: http://snipplr.com/view.php?codeview&id=22482
This is just a helper method'

def bresenham_line(self, (x, y), (x2, y2)):

    if ((not (0 <= x <= (self.width - 1))) or (not (0 <= y <= (self.height - 1))) or (not (0 <= x2 <= (self.width - 1))) or (not (0 <= y2 <= (self.height - 1)))):
        l = Line(self, ((x, y), (x2, y2))).cropToImageEdges()
        if l:
            ep = list(l.end_points)
            ep.sort()
            (x, y) = ep[0]
            (x2, y2) = ep[1]
        else:
            return []
    steep = 0
    coords = []
    dx = abs((x2 - x))
    if ((x2 - x) > 0):
        sx = 1
    else:
        sx = (-1)
    dy = abs((y2 - y))
    if ((y2 - y) > 0):
        sy = 1
    else:
        sy = (-1)
    if (dy > dx):
        steep = 1
        (x, y) = (y, x)
        (dx, dy) = (dy, dx)
        (sx, sy) = (sy, sx)
    d = ((2 * dy) - dx)
    for i in range(0, dx):
        if steep:
            coords.append((y, x))
        else:
            coords.append((x, y))
        while (d >= 0):
            y = (y + sy)
            d = (d - (2 * dx))
        x = (x + sx)
        d = (d + (2 * dy))
    coords.append((x2, y2))
    return coords
