Превышен максимальный стек вызовов Javascript Recursive Floodfill - PullRequest
0 голосов
/ 09 сентября 2018

В настоящее время я делаю редактор пиксельной графики, и мой алгоритм заливки переполнен.

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

...