让Bresenham的算法继续循环

时间:2017-09-30 23:25:35

标签: javascript algorithm pixels bresenham

like this (it's not accurate)

如何更改Bressenham线算法以保持自行循环并创建此效果: (图纸不准确) 我有2个coordenates的basica线:

    drawBresenhamLine = function (x0, y0, x1, y1) {

    var dx, dy, e2, err, sx, sy;
    console.log('Called LBR : ' + x0 + ',' + y0 + '->' + x1 + ',' + y1);
    dx = Math.abs(x1 - x0);
    sx = x0 < x1 ? 1 : -1;
    dy = Math.abs(y1 - y0);
    sy = y0 < y1 ? 1 : -1;
    err = (dx > dy ? dx : -dy) / 2;
    while (true) {
        //console.log('Push : '+x0 +' ,'+ y0);
        setPixel(x0, y0);
        setEnd(x1,y1);
        if (x0 === x1 && y0 === y1) {
            break;
        }
        e2 = err;
        if (e2 > -dx) {
            err -= dy;
            x0 += sx;

        }
        if (e2 < dy) {
            err += dx;
            y0 += sy;

        }

    }

    return null;
};

setPixel(x,y)更改当前像素,drawBresenhamLine将使用其coords下一次迭代

2 个答案:

答案 0 :(得分:0)

// Bresenham的线算法 试试这个零售功能:

function drawLine(x0, y0, x1, y1) {
  var dx = Math.abs(x1 - x0),
      sx = x0 < x1 ? 1 : -1,
      dy = Math.abs(y1 - y0),
      sy = y0 < y1 ? 1 : -1,
      err = dx > dy ? dx : -dy;

  while (x0 != x1 || y0 != y1) {
      setPixel(x0, y0);
      var e2 = err;
      if (e2 > -dx * 2) {
          err -= dy;
          x0 += sx;
     }
     if (e2 < dy * 2) {
         err += dx;
         y0 += sy;
    }
  }
}

使用画布来测试问题,问候;)。

https://codepen.io/anon/pen/qPXOrJ

答案 1 :(得分:0)

假设您有两个定义画布大小的变量:canvasWidthcanvasHeight。无论何时增加x或y,只需针对这些变量进行测试:

if (e2 > -dx) {
    err -= dy;
    x0 += sx;

    // check against sides of canvas:
    if(x0 >= canvasWidth)
       x0 = 0;
    else if(x0 < 0)
       x0 = canvasWidth - 1;
}
if (e2 < dy) {
    err += dx;
    y0 += sy;

    // check against top and bottom of canvas:
    if(y0 >= canvasHeight)
       y0 = 0;
    else if(y0 < 0)
       y0 = canvasHeight - 1;
}

这假设最小x和y值为0.如果不是,那么您可以定义一个min和max x和y来定义画布范围并对其进行测试。