function drawLine(imageData, points) {
function setPoint(x, y) {
const i = Math.round(y) * imageData.width * 4 + Math.round(x) * 4;
imageData.data[i] = 255;
imageData.data[i + 1] = 255;
imageData.data[i + 2] = 255;
imageData.data[i + 3] = 255;
}
const [[x1, y1], [x2, y2]] =
points[0][1] < points[1][1] ? points : [points[1], points[0]];
if (x1 === x2) {
for (let y = y1; y <= y2; y++) {
setPoint(x1, y);
}
return imageData;
}
if (y1 === y2) {
for (let x = Math.min(x1, x2); x <= Math.max(x1, x2); x++) {
setPoint(x, y1);
}
return imageData;
}
const m = (y2 - y1) / (x2 - x1);
const y0 = (x2 * y1 - x1 * y2) / (x2 - x1);
let x;
for (let y = y1, x_calc = x1; y <= y2; y++, x_calc = x) {
x = (y - y0) / m;
const max = Math.max(x_calc, x);
for (x_calc = Math.min(x_calc, x); x_calc <= max; x_calc++) {
setPoint(x_calc, m * x_calc + y0);
}
}
return imageData;
}