public class ColorRGB { public float r; public float g; public float b; //default to white ColorRGB() { r = 1.0f; g = 1.0f; b = 1.0f; } ColorRGB(float r_, float g_, float b_) { r = r_; g = g_; b = b_; } ColorRGB(ColorRGB c) { r = c.r; g = c.g; b = c.b; } public void Set(float r_, float g_, float b_) { r = r_; g = g_; b = b_; } public ColorHSB ToHSB() { //Values which will fill in our color float h_ = 0.0f; float s_ = 0.0f; float b_ = 0.0f; float var_Min = Math.min(r, Math.min(g, b)); //Min of RGB float var_Max = Math.max(r, Math.max(g, b)); //Max of RGB float del_Max = var_Max - var_Min; //Delta RGB value float del_R = 0.0f; float del_G = 0.0f; float del_B = 0.0f; b_ = (var_Max + var_Min)/2.0f; if (del_Max == 0.0f) { h_ = 0.0f; //RGB are the same, so we're grey s_ = 0.0f; } else //we need to handle chroma { if (b_ < 0.5f) s_ = del_Max/(var_Max + var_Min); else s_ = del_Max/(2.0f - var_Max - var_Min); del_R = (((var_Max - r)/6.0f) + (del_Max/2.0f))/del_Max; del_G = (((var_Max - g)/6.0f) + (del_Max/2.0f))/del_Max; del_B = (((var_Max - b)/6.0f) + (del_Max/2.0f))/del_Max; if (r == var_Max) h_ = del_B - del_G; else if (g == var_Max) h_ = (1.0f/3.0f) + del_R - del_B; else if (b == var_Max) h_ = (2.0f/3.0f) + del_G - del_R; if (h_ < 0.0f) h_ += 1.0f; if (h_ > 1.0f) h_ -= 1.0f; } return new ColorHSB(h_, s_, b_); } } public class ColorHSB { public float h; public float s; public float b; ColorHSB() { h = 1.0f; s = 1.0f; b = 1.0f; } ColorHSB(float h_, float s_, float b_) { h = h_; s = s_; b = b_; } ColorHSB(ColorHSB c) { h = c.h; s = c.s; b = c.b; } public void Set(float h_, float s_, float b_) { h = h_; s = s_; b = b_; } //A helper function for converting to RGB. Makes no sense to outsiders private static float Hue_2_RGB(float v1, float v2, float vH) { if (vH < 0.0f) vH += 1.0f; if (vH > 1.0f) vH -= 1.0f; if ((6.0f * vH ) < 1.0f) return (v1 + (v2 - v1) * 6.0f * vH); if ((2.0f * vH) < 1.0f) return v2; if ((3.0f * vH) < 2.0f) return (v1 + (v2 - v1) * ((2.0f / 3.0f) - vH) * 6.0f); return v1; } public ColorRGB ToRGB() { float r_ = 0.0f; float g_ = 0.0f; float b_ = 0.0f; //For passing into the Hue_2_RGB function float var_1; float var_2; if (s == 0.0f) { r_ = b; g_ = b; b_ = b; } else { if (b < 0.5f) var_2 = b*(1.0f + s); else var_2 = (b + s) - (b * s); var_1 = 2.0f*b - var_2; r_ = Hue_2_RGB(var_1, var_2, h+(1.0f/3.0f)); g_ = Hue_2_RGB(var_1, var_2, h); b_ = Hue_2_RGB(var_1, var_2, h-(1.0f/3.0f)); } return new ColorRGB(r_, g_, b_); } }