From 7a58540b6b8dadb7f5edd49a49888a8ff7c8af89 Mon Sep 17 00:00:00 2001 From: nedko Date: Wed, 7 Dec 2022 14:50:39 +0200 Subject: [PATCH] Revert "Revert "Attempt at fixing complimentary algorithm"" This reverts commit 0e7aba599119a5451413d0ed3bb29c4a2edc9d6a. --- complimentary_colour_extractor.cpp | 75 ++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/complimentary_colour_extractor.cpp b/complimentary_colour_extractor.cpp index b0ad7f4..0035124 100644 --- a/complimentary_colour_extractor.cpp +++ b/complimentary_colour_extractor.cpp @@ -2,6 +2,8 @@ #include +#include + // CONSTRUCTORS ComplimentaryColourExtractor::ComplimentaryColourExtractor(struct ColourHSL hsl, size_t h_levels, size_t s_levels, size_t v_levels) @@ -17,28 +19,59 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl, double angle_delta; // double additional_colour_weight; - // if ((0.0 == hsl.s) || (0.0 == m_main_colour.s)) + if ((0 == (1.0 - fabs(2 * m_main_colour.l - 1.0))) || + (0 == (1.0 - fabs(2 * hsl.l - 1.0))) || + (0 == m_main_colour.s) || + (0 == hsl.s)) + { + angle_delta = 90.0; + // additional_colour_weight = 0.5; + } + else + { + // additional_colour_weight = 1.0; + /* SECTION BEGIN */ + angle_delta = fabs(hsl.h - m_main_colour.h); + if (angle_delta > 180.0F) + { + angle_delta = 360.0F - angle_delta; + } + /* SECTION END */ + } + + // double main_x = cos(m_main_colour.h * M_PI / 180.0) * m_main_colour.s; + // double main_y = sin(m_main_colour.h * M_PI / 180.0) * m_main_colour.s; + // double main_z = 1.0 - 2 * m_main_colour.l; + // double eval_x = cos(hsl.h * M_PI / 180.0) * hsl.s; + // double eval_y = sin(hsl.h * M_PI / 180.0) * hsl.s; + // double eval_z = 1.0 - 2 * hsl.l; + // // double total_x = main_x - eval_x; + // // double total_y = main_y - eval_y; + // // double total_z = main_z - eval_z; + // //double vec_magn = sqrt(pow(total_x, 2) + pow(total_y, 2) + pow(total_z, 2)); + // double angle_diff = -(((main_x * eval_x + main_y * eval_y + main_z * eval_z) / + // (sqrt(pow(main_x, 2) + pow(main_y, 2) + pow(main_z, 2)) * + // sqrt(pow(eval_x, 2) + pow(eval_y, 2) + pow(eval_z, 2)))) - 1.0) / 2; + + + // static double max_angle_diff = 0.0; + // printf("Main - %f %f %f\n", m_main_colour.h, m_main_colour.s, m_main_colour.l); + // printf("Eval - %f %f %f\n", hsl.h, hsl.s, hsl.l); + // printf("Main Vec - %f %f %f\n", main_x, main_y, main_z); + // printf("Eval Vec - %f %f %f\n", eval_x, eval_y, eval_z); + // // printf("Res Vec - %f %f %f\n", total_x, total_y, total_z); + // printf("Ang diff - %f\n", angle_diff); + // if (angle_diff > max_angle_diff) // { - // angle_delta = 180.0; - // additional_colour_weight = 0.5; - // } - // else - // { - // additional_colour_weight = 1.0; - // /* SECTION BEGIN */ - // angle_delta = fabs(hsl.h - m_main_colour.h); - // if (angle_delta > 180.0F) - // { - // angle_delta = 360.0F - angle_delta; - // } - // /* SECTION END */ + // max_angle_diff = angle_diff; + // printf("Max Angle Diff\n"); // } - angle_delta = fabs(hsl.h - m_main_colour.h); - if (angle_delta > 180.0F) - { - angle_delta = 360.0F - angle_delta; - } + // angle_delta = fabs(hsl.h - m_main_colour.h); + // if (angle_delta > 180.0F) + // { + // angle_delta = 360.0F - angle_delta; + // } // result = static_cast(round(1000.0 * pow(weight, 0.3) * hsv.v * // fmin(1.0, hsv.v + hsv.s) * additional_colour_weight * angle_delta)); @@ -47,7 +80,9 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl, // additional_colour_weight * angle_delta)); result = static_cast(round(1000.0 * pow(weight, 0.3) * - ((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels) * + pow(((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels), 0.3) * + hsl.s * + // additional_colour_weight * angle_delta)); return result;