【问题标题】:Slightly change the Bresenham/midpoint circle algorithm for nicer results稍微改变 Bresenham/midpoint circle 算法以获得更好的结果
【发布时间】:2016-04-27 18:05:07
【问题描述】:

我确实有两种方法可以通过 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,第二种取自here

【问题讨论】:

  • 你的问题是?
  • @BrentWashburne 我想创建类似于第二个的结果,但使用第一种方法。
  • 你的calcDistance函数和画圆有什么关系?这两种方法都没有提及。
  • @BrentWashburne 你看到 jsfiddle 了吗?在那里你可以看到我是如何使用它的。

标签: javascript algorithm geometry bresenham


【解决方案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);
      }
    }
  }
}

【讨论】:

  • 谢谢,但您的解决方案仅适用于几个半径。 f.e. 2-6 不起作用,9, 11,.. 也不行。
  • 谢谢,但我需要所有可能的半径,至少 1-30
  • 那是稍微扩大题目的范围,现在计算合适的范围是一道数学题。我把这部分留给你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2015-09-20
  • 2020-01-23
  • 2012-07-20
  • 2019-12-22
  • 1970-01-01
  • 2017-10-16
相关资源
最近更新 更多