圆周上的点

时间:2015-11-20 11:58:27

标签: javascript

我在获取圆周上的所有点(整数)时遇到问题。

这是我目前的代码:

function getPixelsInRect(x, y, width, height) {
   var result = [];

   for (var i = y; i < y + height; i++) {
       for (var j = x; j < x + width; j++) {
           result.push([ j, i ]);
       }
   }

   return result;
}

function getPixelsOnCircle(x, y, radius) {
  return getPixelsInRect(x - radius, y - radius, radius * 2, radius *    2).filter(function(pixel) {
    return Math.pow(pixel[0] - x, 2) + Math.pow(pixel[1] - y, 2) == (radius * radius);
  });
}

它过滤掉所有不在圆周上的点。它显然不能正常工作,我确信这不是正确的方法。有什么建议吗?

(链接到jsfiddle:https://jsfiddle.net/852Loubf/

1 个答案:

答案 0 :(得分:1)

是的,我认为这是因为你将距离与radius进行了过于严格的比较

我做了一些更改以考虑阈值,您可以使用新参数threshold,这是一种厚度。低于1,它不是一条连续的线。 (fiddle updated

function getPixelsOnCircle(x, y, radius, threshold) {
    threshold = threshold === undefined ? 1 : threshold;

    return getPixelsInRect(x - radius, y - radius, radius * 2, radius * 2).filter(function(pixel) {
        var rectDist = Math.pow(pixel[0] - x, 2) + Math.pow(pixel[1] - y, 2);
        var rectDistSmoothed = Math.round(rectDist / radius);

        return  rectDistSmoothed <= radius && rectDistSmoothed >= radius - threshold;
    });
}

您的drawPoints功能也需要修复:

points.forEach(function(point) {
    ctx.fillRect(point[0] - 0.5, point[1] - 0.5, 1, 1);
});

getPixelsInRect

for (var i = y; i <= y + height; i++) {
    for (var j = x; j <= x + width; j++) {
        result.push([ j, i ]);
    }
}