#include "complimentary_colour_extractor.h" #include // CONSTRUCTORS ComplimentaryColourExtractor::ComplimentaryColourExtractor(struct ColourHSL hsl, size_t h_levels, size_t s_levels, size_t v_levels) :ColourExtractor(h_levels, s_levels, v_levels), m_main_colour(hsl) { } // PROTECTED FUNCS size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl, double weight) const { size_t result = 0; double angle_delta; 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; } else { /* SECTION BEGIN */ angle_delta = fabs(hsl.h - m_main_colour.h); if (angle_delta > 180.0F) { angle_delta = 360.0F - angle_delta; } /* SECTION END */ } result = static_cast(round(1000.0 * pow(weight, 0.3) * angle_delta * (hsl.s + 1.0 / m_s_levels) * pow(((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels), 0.3))); return result; } // PUBLIC FUNCS struct ColourHSL ComplimentaryColourExtractor::get_main_colour() const { return m_main_colour; } void ComplimentaryColourExtractor::set_main_colour(struct ColourHSL hsl) { m_main_colour = hsl; }