我在获取圆周上的所有点(整数)时遇到问题。
这是我当前的代码:
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/)
最佳答案
嗯,我认为是因为您将距离与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 ]);
}
}