我目前正在制作像素艺术编辑器,我的洪水填充算法似乎溢出了。
fill(x, y, new_color, old_color) {
var data = this.data_at(x, y);
if(data == null) { return; }
var is_old_color = compare_data(data, old_color)
if(!is_old_color) { return; }
this.render_ctx.fillStyle = rgba(new_color);
this.render_ctx.fillRect(x, y, 1, 1);
this.fill(x, y + 1, new_color, old_color)
this.fill(x, y - 1, new_color, old_color)
this.fill(x + 1, y, new_color, old_color)
this.fill(x - 1, y, new_color, old_color)
}
data_at(x, y) {
if(state.current_selection.contains_pixel(x, y)) {
return this.render_ctx.getImageData(x, y, 1, 1).data;
}
return null;
}
compare_data()仅检查当前像素的颜色是否与old_color相同。
使用小于110 * 110像素的画布时,一切正常。任何较大的结果都会超出最大调用堆栈,并且只会填充画布的一部分。