// Reconstructed off the top of my head (not checking any literature or other code)... because I'm a pro srecord noeq BresenhamLineDrawer(int x1, int y1, int x2, int y2) extends Meta is Iterable { int mainStepX, mainStepY; int sideStepX, sideStepY; int i; int x, y; int fraction, increment, denominator; // denominator is also number of pixels to return (minus 1) *(Pt start, Pt end) { x1 = start.x; y1 = start.y; x2 = end.x; y2 = end.y; } simplyCached void init { x = x1; y = y1; if (abs(x2-x1) > abs(y2-y1)) { // go mainly horizontal (right or left) mainStepX = sideStepX = sign(x2-x1); sideStepY = sign(y2-y1); denominator = abs(x2-x1); increment = abs(y2-y1); } else { // go mainly vertical (up or down) mainStepY = sideStepY = sign(y2-y1); sideStepX = sign(x2-x1); denominator = abs(y2-y1); increment = abs(x2-x1); } fraction = denominator/2; if (scaffolding()) printVars BresenhamLineDrawer(+x1, +y1, +x2, +y2, +denominator); } Pt next() { init(); if (i > denominator) null; Pt p = pt(x, y); if (i++ < denominator) { fraction += increment; if (fraction >= denominator) { fraction -= denominator; x += sideStepX; y += sideStepY; } else { x += mainStepX; y += mainStepY; } if (scaffolding()) printVars BresenhamLineDrawer(+i, +fraction, +increment, +denominator, +x, +y, +p); } ret p; } public ItIt iterator() { ret iff_null(-> next()); } public PtBuffer points() { ret new PtBuffer(iterator()); } }