Я готовлюсь к интервью, где, как мне кажется, они могут попросить меня изменить написанное мной приложение для обработки диагональных линий.
Простая программа может нарисовать холст в терминале, а затем добавить фигуры вit.
Будет создано следующее C 20 4
:
----------------------
| |
| |
| |
| |
----------------------
Теперь я пытаюсь обработать диагональные линии так, чтобы L 2 1 11 4
(это две точки, представленные как x1, y1, x2, y2) приводит к:
----------------------
| x |
| x |
| x |
| x |
----------------------
По крайней мере, я так думаю.Я попробовал оба ответа отсюда: Алгоритм Брезенхема в Javascript
Итак, функция apply
выглядит следующим образом:
apply(canvas) {
const dx = Math.abs(this.x2 - this.x1);
const dy = Math.abs(this.y2 - this.y1);
const sx = (this.x1 < this.x2) ? 1 : -1;
const sy = (this.y1 < this.y2) ? 1 : -1;
let err = dx - dy;
let x1 = this.x1;
let y1 = this.y1;
let x2 = this.x2;
let y2 = this.y2;
canvas.pixels[y1][x1] = 'x';
while(true) {
canvas.pixels[y1][x1] = 'x';
if ((x1 === x2) && (y1 === y2)) break;
const e2 = 2 * err;
if (e2 > -dy) { err -= dy; x1 += sx; }
if (e2 < dx) { err += dx; y1 += sy; }
}
}
Но я получаю обратнослишком много итераций на x, поэтому линия слишком толстая:
----------------------
| xx |
| xxx |
| xxx |
| xx |
----------------------
Вот запускаемая демка : https://repl.it/@DominicTobias/Bresenhams-line-algo
Тип C 20 4
, нажмите EnterТогда L 2 1 11 4
.
Любая помощь приветствуется!