srecord noeq BresenhamLineDrawer(int x1, int y1, int x2, int y2) is Iterable { int mainStepX, mainStepY; int sideStepX, sideStepY; int i, steps; int x, y; int fraction, increment; simplyCached void init { x = x1; y = y1; if (x2-x1 > y2-y1) { // go mainly horizontal (right or left) mainStepX = sideStepX = sign(x2-x1); sideStepY = sign(y2-y1); steps = abs(x2-x1); increment = abs(y2-y1); } else { // go mainly vertical (up or down) mainStepY = sideStepY = sign(y2-y1); sideStepX = sign(x2-x1); steps = abs(y2-y1); increment = abs(x2-x1); } } Pt next() { init(); if (i > steps) null; Pt p = pt(x1, y1); if (++i < steps) { fraction += increment; if (fraction >= steps) { fraction -= steps; x += sideStepX; y += sideStepY; } else { x += mainStepX; y += mainStepY; } } ret p; } public ItIt iterator() { ret iff_null(-> next()); } }