diff --git a/src/seam-carving.cpp b/src/seam-carving.cpp index 58fd6ea..92caa67 100644 --- a/src/seam-carving.cpp +++ b/src/seam-carving.cpp @@ -107,21 +107,23 @@ std::vector optimal_vertical_seam(std::vector energy, int width, int //* Backtracking to find the path for (auto i=height-1; i > 0; i--) { // We want to find either (bot_l, bot_c, bot_r) with dyn_energy[.] = min_val - energy[cur] - float objective_energy = min_val - energy[width*i + min_idx]; - //! With float, we don't always have x + y - y = x - if (nearly_equal(dyn_energy[width*(i-1) + min_idx], objective_energy)) { + //Idea : float next_energy = min_val - energy[width*i + min_idx]; + //! With floats, we don't always have x + y - y == x, so we check is x+y == x+y + auto is_next_idx = [=](int idx) { + return nearly_equal(dyn_energy[(i-1)*width + idx]+energy[width*i + min_idx], min_val); + }; + + if (is_next_idx(min_idx)) { // min_idx does not change min_val = dyn_energy[(i-1)*width + min_idx]; - } else if (min_idx > 0 && nearly_equal(dyn_energy[(i-1)*width + (min_idx-1)], objective_energy)) { + } else if (min_idx > 0 && is_next_idx(min_idx-1)) { min_val = dyn_energy[(i-1)*width + (min_idx-1)]; min_idx = min_idx - 1; - } else if (min_idx+1 < width && nearly_equal(dyn_energy[(i-1)*width + (min_idx+1)], objective_energy)) { + } else if (min_idx+1 < width && is_next_idx(min_idx+1)) { min_val = dyn_energy[(i-1)*width + (min_idx+1)]; min_idx = min_idx + 1; } else { - std::cerr << dyn_energy[(i-1)*width + min_idx] <<", "<< dyn_energy[(i-1)*width + (min_idx-1)] - <<", "<< dyn_energy[(i-1)*width + (min_idx+1)] <<" != "<< objective_energy << std::endl; std::cerr << "Unable to backtrack path !" << std::endl; exit(1); }