【发布时间】:2022-08-22 01:18:08
【问题描述】:
这是我的绘图应用程序中使用 p5.js 库的油漆桶工具的代码。功能self.floodFill由于递归,总是得到“超出最大调用堆栈大小”,我想知道修复它的方法。我在想将函数更改为无递归函数是否有帮助。任何帮助,将不胜感激。
function BucketTool(){
var self = this;
//set an icon and a name for the object
self.icon = \"assets/bucket.jpg\";
self.name = \"Bucket\";
var d = pixelDensity();
var oldColor;
var searchDirections = [[1,0],[-1,0],[0,1],[0,-1]];
var pixelsToFill = [];
var positionArray = new Array(2);
self.checkBoundary = function(currentX, currentY, localOldColor) {
if (self.getPixelAtXYPosition(currentX,currentY).toString() != localOldColor.toString() || currentX < 0 || currentY < 0 || currentX > width || currentY > height || pixelsToFill.indexOf(currentX+\" \"+currentY) != -1) {
return false;
}
return true;
};
self.floodFill = function(currentX, currentY, localOldColor, localSearchDirections) {
if (self.checkBoundary(currentX, currentY, localOldColor)){
pixelsToFill.push(currentX+\" \"+currentY);
} else {
return;
}
for (var i = 0; i < searchDirections.length; i++){
self.floodFill(currentX + searchDirections[i][0], currentY + searchDirections[i][1], localOldColor, localSearchDirections);
}
};
self.getPixelAtXYPosition = function(x, y) {
var colour = [];
for (var i = 0; i < d; i++) {
for (var j = 0; j < d; j++) {
// loop over
index = 4 * ((y * d + j) * width * d + (x * d + i));
colour[0] = pixels[index];
colour[1] = pixels[index+1];
colour[2] = pixels[index+2];
colour[3] = pixels[index+3];
}
}
return colour;
}
self.drawTheNeededPixels = function(){
for(var i = 0; i < pixelsToFill.length; i++){
positionArray = pixelsToFill[i].split(\" \");
point(positionArray[0],positionArray[1]);
}
}
self.draw = function () {
if(mouseIsPressed){
pixelsToFill = [];
loadPixels();
oldColor = self.getPixelAtXYPosition(mouseX, mouseY);
self.floodFill(mouseX, mouseY, oldColor, searchDirections);
self.drawTheNeededPixels();
}
};
}
-
你能提供其余的javascript代码吗?例如,
mouseIsPressed是如何被评估的? -
该库的所有代码引用都在p5js.org 中。比如
mouseIsPressed在p5js.org/reference/#/p5/mouseIsPressed。非常感谢 -
你填位置
(x, y),然后方向[1, 0],你填(x + 1, y),然后方向[-1, 0]你填(x, y),然后方向[1, 0],你\'正在填写(x + 1, y),然后使用方向[-1, 0],您正在填写(x, y),然后使用...您需要跟踪您已填写的那些。 -
问题是当我画一个小圆圈并在里面点击时,我可以毫无错误地填充。但是,当我单击更大的空间时,它会立即收到错误消息。
-
您可以尝试制作一个工作示例吗?调试起来会更容易。
标签: javascript recursion drawing p5.js flood-fill