Thick Lines
We can make the line thicker by drawing an additional pixel along the minor axis of the line. This method works well with lines up to a thickness of 3. After that, the ends of the line become visually jarring, as they are alway horizontal or vertical.
void Line(Image& image, int x0, int y0, int x1, int y1, Color& val) {
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int xStep = x0 < x1 ? 1 : -1;
int yStep = y0 < y1 ? 1 : -1;
int error = 0;
if (dx > dy) {
int m = 2 * dy;
int scale = 2 * dx;
for (int x = x0, y = y0; x != x1 + xStep; x += xStep) {
PutPixel(image, x, y, val);
PutPixel(image, x, y + yStep, val); // 2 px thick
error += m;
if (error >= dx) {
y += yStep;
error -= scale;
}
}
}
else {
int m = 2 * dx;
int scale = 2 * dy;
for (int y = y0, x = x0; y != y1 + yStep; y += yStep) {
PutPixel(image, x, y, val);
PutPixel(image, x + xStep, y, val); // 2 px thick
error += m;
if (error >= dy) {
x += xStep;
error -= scale;
}
}
}
}
Really Thick Lines
To make thicker lines that don't look jarring we need to stamp a pattern at each pixel. Any time the x or y coordinate changes, the stamp should be repeated to avoid missing pixels.
// Stamps some pattern at x / y coord
void Stamp(Image& image, int x, int y, Color& col);
void Line(Image& image, int x0, int y0, int x1, int y1, Color& val) {
int absXDelta = abs(x1 - x0);
int absYDelta = abs(y1 - y0);
int steps = max(absXDelta, absYDelta);
int xDir = x0 < x1 ? 1 : -1;
int yDir = y0 < y1 ? 1 : -1;
int x = x0, xNumerator = 0;
int y = y0, yNumerator = 0;
for (int i = 0; i <= steps; ++i) {
Stamp(image, x, y, val)
xNumerator += absXDelta;
if (xNumerator >= steps) {
x += xDir;
xNumerator -= steps;
Stamp(image, x, y, val)
}
yNumerator += absYDelta;
if (yNumerator >= steps) {
y += yDir;
yNumerator -= steps;
Stamp(image, x, y, val)
}
}
}