В настоящее время я делаю редактор пиксельной графики, и мой алгоритм заливки переполнен.
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 пикселей все работает нормально. Все, что больше, приводит к превышению максимального стека вызовов и заполняет только часть холста.