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) init2(x1, y1, x2, y2); else // go mainly vertical (up or down) init2(y1, x1, y2, x2); } void init2(int x1, int y1, int x2, int y2) { mainStepX = sign(x2-x1); sideStepY = sign(y2-y1); steps = abs(x2-x1); increment = abs(y2-y1); } Pt next() { init(); if (i > steps) null; Pt p = pt(x1, y1); if (++i < steps) { fraction += increment; if (fraction >= steps) { fraction -= steps; x += mainStepX; y += mainStepY; } } ret p; } ItIt iterator() { ret iff(-> next()); } }