void hsv_to_rgb(t_env *e, double p, double q, double t) { double hh; double ff; int i; hh = e->h / 60; i = floor(hh); ff = hh - i; p = e->v * (1.0 - e->s); q = e->v * (1.0 - (e->s * ff)); t = e->v * (e->s * (1.0 - ff)); p *= 250; q *= 250; t *= 250; (i == 0) ? hsv0(e, p, t) : 1; (i == 1) ? hsv1(e, p, q) : 1; (i == 2) ? hsv2(e, p, t) : 1; (i == 3) ? hsv3(e, p, q) : 1; (i == 4) ? hsv4(e, p, t) : 1; if (i == 5) { e->r = e->v; e->g = p; e->b = q; } }
// ---------- begin of function ColorTable::color_dist_hsv --------// int ColorTable::color_dist_hsv(RGBColor c1, RGBColor c2) { // calculate a distance for the colour // h betweeh 0 and 6 // s between 0 and 1 // v between 0 and 1 HSVColor hsv1(rgb2hsv(c1)); HSVColor hsv2(rgb2hsv(c2));; double dx = hsv2.saturation * cos(hsv2.hue * M_PI / 3.0) - hsv1.saturation * cos(hsv1.hue * M_PI / 3.0); double dy = hsv2.saturation * sin(hsv2.hue * M_PI / 3.0) - hsv1.saturation * sin(hsv1.hue * M_PI / 3.0); double dv = hsv2.brightness - hsv1.brightness; return int(10000 * ( dx*dx + dy*dy + dv*dv*BRIGHTNESS_WEIGHTING )); }