image-colours/complimentary_colour_extractor.cpp
2022-12-07 14:39:46 +02:00

66 lines
1.6 KiB
C++

#include "complimentary_colour_extractor.h"
#include <math.h>
// 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;
// double additional_colour_weight;
// if ((0.0 == hsl.s) || (0.0 == m_main_colour.s))
// {
// 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 */
// }
angle_delta = fabs(hsl.h - m_main_colour.h);
if (angle_delta > 180.0F)
{
angle_delta = 360.0F - angle_delta;
}
// result = static_cast<size_t>(round(1000.0 * pow(weight, 0.3) * hsv.v *
// fmin(1.0, hsv.v + hsv.s) * additional_colour_weight * angle_delta));
// result = static_cast<size_t>(round(1000.0 * pow(weight, 0.3) * hsl.l *
// additional_colour_weight * angle_delta));
result = static_cast<size_t>(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) *
angle_delta));
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;
}