Fixed HSL algorithm. It prefers colours to white/black
This commit is contained in:
parent
7a58540b6b
commit
d8deafbdc7
@ -1,9 +1,6 @@
|
|||||||
#include "complimentary_colour_extractor.h"
|
#include "complimentary_colour_extractor.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
// CONSTRUCTORS
|
// CONSTRUCTORS
|
||||||
ComplimentaryColourExtractor::ComplimentaryColourExtractor(struct ColourHSL hsl,
|
ComplimentaryColourExtractor::ComplimentaryColourExtractor(struct ColourHSL hsl,
|
||||||
size_t h_levels, size_t s_levels, size_t v_levels)
|
size_t h_levels, size_t s_levels, size_t v_levels)
|
||||||
@ -17,7 +14,6 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl,
|
|||||||
{
|
{
|
||||||
size_t result = 0;
|
size_t result = 0;
|
||||||
double angle_delta;
|
double angle_delta;
|
||||||
// double additional_colour_weight;
|
|
||||||
|
|
||||||
if ((0 == (1.0 - fabs(2 * m_main_colour.l - 1.0))) ||
|
if ((0 == (1.0 - fabs(2 * m_main_colour.l - 1.0))) ||
|
||||||
(0 == (1.0 - fabs(2 * hsl.l - 1.0))) ||
|
(0 == (1.0 - fabs(2 * hsl.l - 1.0))) ||
|
||||||
@ -25,11 +21,9 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl,
|
|||||||
(0 == hsl.s))
|
(0 == hsl.s))
|
||||||
{
|
{
|
||||||
angle_delta = 90.0;
|
angle_delta = 90.0;
|
||||||
// additional_colour_weight = 0.5;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// additional_colour_weight = 1.0;
|
|
||||||
/* SECTION BEGIN */
|
/* SECTION BEGIN */
|
||||||
angle_delta = fabs(hsl.h - m_main_colour.h);
|
angle_delta = fabs(hsl.h - m_main_colour.h);
|
||||||
if (angle_delta > 180.0F)
|
if (angle_delta > 180.0F)
|
||||||
@ -39,51 +33,9 @@ size_t ComplimentaryColourExtractor::evaluate_colour(struct ColourHSL hsl,
|
|||||||
/* SECTION END */
|
/* SECTION END */
|
||||||
}
|
}
|
||||||
|
|
||||||
// double main_x = cos(m_main_colour.h * M_PI / 180.0) * m_main_colour.s;
|
result = static_cast<size_t>(round(1000.0 * pow(weight, 0.3) * angle_delta *
|
||||||
// double main_y = sin(m_main_colour.h * M_PI / 180.0) * m_main_colour.s;
|
(hsl.s + 1.0 / m_s_levels) *
|
||||||
// double main_z = 1.0 - 2 * m_main_colour.l;
|
pow(((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels), 0.3)));
|
||||||
// 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)
|
|
||||||
// {
|
|
||||||
// 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;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 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) *
|
|
||||||
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
5
main.cpp
5
main.cpp
@ -1,6 +1,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iomanip>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
#include "stb_image.h"
|
#include "stb_image.h"
|
||||||
@ -18,8 +18,7 @@ void print_pixel(ColourRGB rgb)
|
|||||||
uint8_t g = static_cast<uint8_t>(round(rgb.g * 255));
|
uint8_t g = static_cast<uint8_t>(round(rgb.g * 255));
|
||||||
uint8_t b = static_cast<uint8_t>(round(rgb.b * 255));
|
uint8_t b = static_cast<uint8_t>(round(rgb.b * 255));
|
||||||
|
|
||||||
cout << "#" << std::hex << (int)r << (int)g << (int)b;
|
printf("#%02x%02x%02x - %3d %3d %3d", r, g ,b, r, g, b);
|
||||||
cout << std::dec << " - " << (int)r << " " << (int)g << " " << (int)b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void usage(char *name)
|
void usage(char *name)
|
||||||
|
|||||||
@ -16,7 +16,7 @@ size_t MainColourExtractor::evaluate_colour(struct ColourHSL hsl, double weight)
|
|||||||
size_t result = 0;
|
size_t result = 0;
|
||||||
|
|
||||||
result = static_cast<size_t>(round(1000.0 * pow(weight, 0.3) *
|
result = static_cast<size_t>(round(1000.0 * pow(weight, 0.3) *
|
||||||
(hsl.s + 1.0 / m_h_levels) *
|
(hsl.s + 1.0 / m_s_levels) *
|
||||||
((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels)));
|
((1.0 - fabs(2 * hsl.l - 1.0)) * (1 - 1.0 / m_l_levels) + 1.0 / m_l_levels)));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user