private static Color ToColor(double hue, double sat, double bri) {
while (hue < 0) {
hue += 360;
}
while (hue >= 360) {
hue -= 360;
}
double r, g, b;
if (bri <= 0) {
r = g = b = 0;
} else if (sat <= 0) {
r = g = b = bri;
} else {
var hf = hue / 60.0;
var i = (int)Math.Floor(hf);
var f = hf - i;
var pv = bri * (1 - sat);
var qv = bri * (1 - sat * f);
var tv = bri * (1 - sat * (1 - f));
switch (i) {
case 0:
r = bri;
g = tv;
b = pv;
break;
case 1:
r = qv;
g = bri;
b = pv;
break;
case 2:
r = pv;
g = bri;
b = tv;
break;
case 3:
r = pv;
g = qv;
b = bri;
break;
case 4:
r = tv;
g = pv;
b = bri;
break;
case 5:
r = bri;
g = pv;
b = qv;
break;
case 6:
r = bri;
g = tv;
b = pv;
break;
case -1:
r = bri;
g = pv;
b = qv;
break;
default:
r = g = b = bri;
break;
}
}
return Color.FromArgb((int)(r.Saturate() * 255d), (int)(g.Saturate() * 255d), (int)(b.Saturate() * 255d));
}
}