略微改变Bresenham /中点圆算法以获得更好的结果

时间:2016-04-27 18:05:07

标签: javascript algorithm geometry bresenham

我有两种通过bresenham / midpoint算法创建实心圆的方法。 但第二种方式看起来远比第一种方式好。

bresenham/midpoint

我想创建第二个结果,但是第一个结果 一。我想用第一种方式做到这一点因为我需要一个正确的公式来计算目前的距离:

function calcDistance (pos,pos2,range){
    var x1 = pos.hasOwnProperty('x') ? pos.x : pos[0],
        y1 = pos.hasOwnProperty('y') ? pos.y : pos[1],
        x2 = pos2.hasOwnProperty('x') ? pos2.x : pos2[0],
        y2 = pos2.hasOwnProperty('y') ? pos2.y : pos2[1];
    return Math.pow((x1-x2),2) + Math.pow((y1-y2),2) - Math.pow(range, 2)
};

这是jsfiddle。第一种方法取自wikipedia <{3}}

中的第二种方法

1 个答案:

答案 0 :(得分:1)

当距离为<= 0时,不是绘制点,而是在距离为<= radius*radius*zoom时绘制点:

编辑:应用缩放系数(8.0/radius)

function drawCircle(x0, y0, radius){
  var range = radius*radius*zoom*(8.0/radius);    // calculate the range once
  for(var x = 0; x < imageWidth/zoom; x++){
    for(var y = 0; y < imageHeight/zoom; y++){
      if(calcDistance([x0,y0],[x*zoom,y*zoom],radius*zoom) <= range){
        context.fillRect(x*zoom,y*zoom,zoom,zoom);
      }
    }
  }
}