Bresenham算法使线条太粗

时间:2019-05-30 19:23:33

标签: javascript math bresenham

我正在准备面试,我认为他们可以要求我修改我编写的用于处理对角线绘制的应用。

简单的程序可以在终端中绘制画布,然后在其中添加形状。

将创建以下C 20 4

----------------------
|                    |
|                    |
|                    |
|                    |
----------------------

现在,我正在尝试处理对角线,以使L 2 1 11 4(这两个点分别表示为x1,y1,x2,y2)产生:

----------------------
| x                  |
|    x               |
|       x            |
|          x         |
----------------------

至少我认为应该是这样。我从这里尝试了两个答案:Bresenham algorithm in 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

任何帮助表示赞赏!

0 个答案:

没有答案