// // Created by Wouter Groeneveld on 14/12/18. // #include std::deque VectorFx::bresenhamLineTo(VECTOR dest) { // https://www.coranac.com/tonc/text/bitmaps.htm - Bresenham's line algorithm with fixed points VECTOR src = this->v; VECTOR step, delta; std::deque coords; if(src.x > dest.x) { step.x = -1; delta.x = (src.x - dest.x); } else { step.x = +1; delta.x = (dest.x - src.x); } if(src.y > dest.y) { step.y = -1; delta.y = (src.y - dest.y); } else { step.y = +1; delta.y = (dest.y - src.y); } int dd, x = src.x, y = src.y, ii; if(delta.y == 0) { // horizontal for(ii = 0; ii <= delta.x; ii++) { coords.push_back({x, y}); x += step.x; } } else if(delta.x == 0) { // vertical for(ii = 0; ii <= delta.y; ii++) { coords.push_back({x, y}); y += step.y; } } else if(delta.x >= delta.y) { // Diagonal, slopeFx <= 1 dd = 2 * delta.y - delta.x; for(ii = 0; ii <= delta.x; ii++) { coords.push_back({x, y}); if(dd >= 0) { dd -= 2 * delta.x; y += step.y; } dd += 2 * delta.y; x += step.x; } } else { // Diagonal, slopeFx > 1 dd = 2 * delta.x - delta.y; for(ii = 0; ii <= delta.y; ii++) { coords.push_back({x, y}); if(dd >= 0) { dd -= 2 * delta.y; x += step.x; } dd += 2 * delta.x; y += step.y; } } return coords; }