53 lines
1.2 KiB
C++
53 lines
1.2 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;
|
|
|
|
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<size_t>(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;
|
|
}
|