我在获取圆周上的所有点(整数)时遇到问题。
这是我目前的代码:
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/)
答案 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 ]);
}
}