【发布时间】:2014-07-04 13:23:20
【问题描述】:
我正在使用 HTML 画布创建一个绘图应用程序,并且我正在尝试实现一个“油漆桶”工具,该工具将检测与单击的像素颜色相同的任何相邻像素,并用新的填充颜色。
我收到“未捕获的 RangeError:超出最大调用堆栈大小”,但我无法弄清楚我的逻辑有什么问题:
function fillTool(){
theCanvas.mousedown(function(e){
var baseColor = paintUtilities.getPixelColor(e.offsetX, e.offsetY);
context.fillStyle = color;
fillNeighbors(e.offsetX, e.offsetY, baseColor);
});
}
function fillNeighbors(x, y, baseColor) {
context.fillRect(x, y, 1, 1);
if (x > 0 && paintUtilities.getPixelColor(x - 1, y) === baseColor) {
fillNeighbors(x - 1, y, baseColor);
}
if (y > 0 && paintUtilities.getPixelColor(x, y - 1) === baseColor) {
fillNeighbors(x, y - 1, baseColor);
}
if (x < theCanvas.attr("width") - 1 && paintUtilities.getPixelColor(x + 1, y) === baseColor) {
fillNeighbors(x + 1, y, baseColor);
}
if (y < theCanvas.attr("height") - 1 && paintUtilities.getPixelColor(x, y + 1) === baseColor) {
fillNeighbors(x, y + 1, baseColor);
}
}
【问题讨论】:
-
显然
fillNeighbors调用自身次数过多。因此,您的条件之一可能不正确。 Learn how to debug JavaScript,添加一些console.log语句,你会明白的。 -
因为在某些时候你会得到
x等于width- 一个不存在的坐标。x应该只允许上升到width-1。y和height相同。 -
this answer 有什么解释吗?
-
换句话说,我的逻辑没有任何“错误”,但如果我分别填充每个像素,我的浏览器仍然无法处理这么多的函数调用。如果不是逐个像素地实现此工具,还有其他想法吗?
-
@Noam the Wikipedia article on flood fill 有一些基本构建自己的堆栈的想法。
标签: javascript jquery html canvas