public int CompareTo(Color other) { int comparison; var thisCategory = GetColorCategory(); comparison = ((int)thisCategory).CompareTo((int)other.GetColorCategory()); if (comparison != 0) { return(comparison); } comparison = ColorConversion.RgbToLum(ColorConversion.ColorToRgb(this)) .CompareTo(ColorConversion.RgbToLum(ColorConversion.ColorToRgb(other))); if ((int)thisCategory % 2 == 0) { comparison = -comparison; } if (comparison != 0) { return(comparison); } return(comparison); }
private ColorCategory GetColorCategory() { var rgb = ColorConversion.ColorToRgb(this); var hsv = ColorConversion.RgbToHsv(rgb); if (hsv[1] < 0.12f) { return(ColorCategory.Grays); } float lumCutoff; if (hsv[1] > 0.9) { lumCutoff = 0.1f; } else if (hsv[1] > 0.8) { lumCutoff = 0.13f; } else if (hsv[1] > 0.6) { lumCutoff = 0.19f; } else if (hsv[1] > 0.4) { lumCutoff = 0.22f; } else { lumCutoff = 0.28f; } var lum = Math.Sqrt(ColorConversion.RgbToLum(rgb)); if (lum < lumCutoff) { return(ColorCategory.Grays); } if (hsv[0] <= 26) { return(ColorCategory.Red); } if (hsv[0] <= 44) { return(ColorCategory.Orange); } if (hsv[0] <= 69) { return(ColorCategory.Yellow); } if (hsv[0] <= 152) { return(ColorCategory.Green); } if (hsv[0] <= 184) { return(ColorCategory.Cyan); } if (hsv[0] <= 257) { return(ColorCategory.Blue); } if (hsv[0] <= 296) { return(ColorCategory.Purple); } if (hsv[0] <= 330) { return(ColorCategory.Pink); } return(ColorCategory.Red); }