Bresenham algo делает линию слишком толстой - PullRequest
0 голосов
/ 30 мая 2019

Я готовлюсь к интервью, где, как мне кажется, они могут попросить меня изменить написанное мной приложение для обработки диагональных линий.

Простая программа может нарисовать холст в терминале, а затем добавить фигуры в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.

Любая помощь приветствуется!

...