31 int cdim,
double accuracy,
32 int seed,
double *colors,
34 double *color_diff_sum0) {
39 static const int iter_max = 100;
41 double black[] = {0, 0, 0};
44 const int max_level =
d2i(fmin(30, fmax(1, -log(accuracy) / log(2.))));
47 color_rgb rgb = { .
r = 255*0.5, .g = 0, .b = 0 };
49 red[0] = lab.
l; red[1] = lab.
a; red[2] = lab.
b;
52 const size_t n =
A->m;
58 *color_diff0 = 1000; *color_diff_sum0 = 1000;
60 for (
int i = 0; i < cdim; i++) colors[i] = 0;
61 *color_diff0 = sqrt(cdim); *color_diff_sum0 = sqrt(cdim);
72 *color_diff0 = 1000; *color_diff_sum0 = 1000;
75 for (
int i = 0; i < cdim; i++) colors[i] = 0;
76 for (
int i = 0; i < cdim; i++) colors[cdim+i] = 0;
78 *color_diff0 = sqrt(cdim); *color_diff_sum0 = sqrt(cdim);
83 const int *ia =
A->ia;
84 const int *ja =
A->ja;
88 const double cspace_size = 0.7;
89 double center[] = {cspace_size * 0.5, cspace_size * 0.5, cspace_size * 0.5};
90 const double width = cspace_size * 0.5;
94 for (
int i = 0; i < (int)n * cdim; i++) colors[i] = cspace_size*
drand();
96 double *x =
gv_calloc(cdim * n,
sizeof(
double));
97 double *wgt = weightedQ ?
gv_calloc(n,
sizeof(
double)) :
NULL;
99 double color_diff = 0;
100 double color_diff_old = -1;
101 double color_diff_sum = 0;
102 double color_diff_sum_old = -1;
104 while (iter++ < iter_max && (color_diff > color_diff_old || (color_diff == color_diff_old && color_diff_sum > color_diff_sum_old))){
105 color_diff_old = color_diff;
106 color_diff_sum_old = color_diff_sum;
107 for (
size_t i = 0; i < n; i++){
109 for (
int j = ia[i]; j < ia[i+1]; j++){
110 if (ja[j] == (
int)i)
continue;
111 memcpy(&(x[k*cdim]), &(colors[ja[j]*cdim]),
sizeof(
double)*cdim);
112 if (wgt && a) wgt[k] = a[j];
115 cc = &(colors[(int)i * cdim]);
124 color_diff = dist_max;
125 color_diff_sum = dist_max;
127 color_diff =
MIN(dist_max, color_diff);
128 color_diff_sum += dist_max;
132 GV_DEBUG(
"iter ---- %d ---, color_diff = %f, color_diff_sum = %f", iter,
133 color_diff, color_diff_sum);
138 for (
size_t i = 0; i < n; i++){
140 colors[(
int)i * cdim + 1],
141 colors[(
int)i * cdim + 2]);
143 colors[(int)i * cdim] = rgb.
r /255;
144 colors[(int)i * cdim + 1] = rgb.
g / 255;
145 colors[(int)i * cdim + 2] = rgb.
b / 255;
148 *color_diff0 = color_diff;
149 *color_diff_sum0 = color_diff_sum;
156 int cdim,
double accuracy,
157 int seed,
double *colors) {
160 double color_diff_sum;
163 int iter, seed_max = -1;
164 double color_diff_max = -1;
167 for (i = 0; i < iter; i++){
170 if (color_diff_max < color_diff){
171 seed_max =
seed; color_diff_max = color_diff;
182 int seed,
size_t *cdim0,
double **colors) {
191 int maxcolors = 10000, max_qtree_level = 10, r, g, b;
193 if (color_list) color_scheme = color_list;
197 if (strcmp(color_scheme,
"lab") == 0){
202 fprintf(stderr,
"out of memory\n");
205 }
else if (strcmp(color_scheme,
"rgb") == 0){
208 }
else if (strcmp(color_scheme,
"gray") == 0){
212 }
else if (sscanf(color_scheme,
"#%02X%02X%02X", &r, &g, &b) == 3 ){
215 assert(color_points);
225 if (accuracy <= 0) accuracy = 0.0001;
227 const size_t n =
A->m;
228 if (n != (
size_t)
A->n) {
233 *colors =
gv_calloc(cdim * n,
sizeof(
double));
234 double *ctmp =
gv_calloc(cdim * n,
sizeof(
double));
241 for (
size_t i = 0; i < ncomps; i++){
242 nn = comps_ptr[i+1] - comps_ptr[i];
246 for (j = comps_ptr[i]; j < comps_ptr[i+1]; j++){
247 jj = j - comps_ptr[i];
248 memcpy(&((*colors)[comps[j]*cdim]), &(ctmp[jj*cdim]), cdim*
sizeof(
double));
void QuadTree_get_nearest(QuadTree qt, double *x, double *ymin, int *imin, double *min)
QuadTree QuadTree_new_from_point_list(int dim, int n, int max_level, double *coord)
void QuadTree_delete(QuadTree q)
int * SparseMatrix_weakly_connected_components(SparseMatrix A0, size_t *ncomp, int **comps)
SparseMatrix SparseMatrix_get_submatrix(SparseMatrix A, int nrow, int ncol, int *rindices, int *cindices)
SparseMatrix SparseMatrix_symmetrize(SparseMatrix A, bool pattern_symmetric_only)
void SparseMatrix_delete(SparseMatrix A)
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
const char * color_palettes_get(const char *color_palette_name)
helpers for verbose/debug printing
void furtherest_point_in_list(int k, int dim, double *wgt, double *pts, QuadTree qt, int max_level, double *dist_max, double **argmax)
void furtherest_point(int k, int dim, double *wgt, double *pts, double *center, double width, int max_level, double *dist_max, double **argmax)
Arithmetic helper functions.
static const char black[]
QuadTree lab_gamut_quadtree(const int *lightness, int max_qtree_level)
construct a quadtree of the LAB gamut points
void LAB2RGB_real_01(double *color)
color_lab color_lab_init(double l, double a, double b)
color_lab RGB2LAB(color_rgb color)
double * color_blend_rgb2lab(const char *color_list, const int maxpoints)
color_rgb LAB2RGB(color_lab color)
static void node_distinct_coloring_internal(int scheme, QuadTree qt, bool weightedQ, SparseMatrix A, int cdim, double accuracy, int seed, double *colors)
static void node_distinct_coloring_internal2(int scheme, QuadTree qt, bool weightedQ, SparseMatrix A, int cdim, double accuracy, int seed, double *colors, double *color_diff0, double *color_diff_sum0)
int node_distinct_coloring(const char *color_scheme, int *lightness, bool weightedQ, SparseMatrix A0, double accuracy, int seed, size_t *cdim0, double **colors)
size_t gv_random(size_t bound)
double b
l: 0 to 100, a,b: -128 to 128
static point center(point vertex[], size_t n)