From 3bd422ab9fe917ac9bdd3f55dacbd62bb4c59b15 Mon Sep 17 00:00:00 2001 From: augustin64 Date: Wed, 26 Mar 2025 15:44:49 +0100 Subject: [PATCH] Maybe by doing calculations in the same order ? --- src/seam-carving.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) 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); }