Не знаю, правильно ли я понял вопрос, но думаю, вы спрашиваете, является ли цвет более зеленым, более синим или синим красным?
Это даст вам информацию о том, в каком разделе (красный, зеленый или синий) он находится.
Для этого без учета человеческого восприятия цветов вы можете сделать:
public enum ColorSection
{
Red,
Green,
Blue
}
public ColorSection GetColorSection(int rgb)
{
int r = rgb & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 16) & 0xFF;
return (r > g && r > b) ? ColorSection.Red : ((g > b) ? ColorSection.Green : ColorSection.Blue);
}
Конечно, это не очень хорошо работает, если у вас есть цвета с двумя равными значениями, если у вас есть красный = зеленый, он возвращает красный.
Если у вас есть белый, он возвращается красным, если у вас есть черный, он возвращает синий.
Если вам нужно что-то более причудливое, вероятно, как вы и просите, тогда вам нужно использовать приближение ближайшего соседа и полярные координаты.
Вы можете вычислить угол, используя, как указано, оттенок.
Из угла вы можете просто преобразовать его в целое число.
Чтобы вычислить оттенок:
public static double GetHue(int rgb)
{
double result = 0.0;
int r = rgb & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = (rgb >> 16) & 0xFF;
if (r != g && g != b)
{
double red = r / 255.0;
double green = g / 255.0;
double blue = b / 255.0;
double max = Math.Max(Math.Max(red, green), blue);
double min = Math.Min(Math.Min(red, green), blue);
double delta = max - min;
if (delta != 0)
{
if (red == max)
result = (green - blue) / delta;
else if (green == max)
result = 2 + ((blue - red) / delta);
else if (blue == max)
result = 4 + ((red - green) / delta);
result *= 60.0;
if (result < 0)
result += 360.0;
}
}
return result;
}
Возвращает угол в градусах от 0 до 360 от того, где вы находитесь в цветовом круге.
Вы можете вычислить, чем раздел, используя ближайший сосед.
Например:
const int NumberOfSections = 10;
int section = (int)(GetHue() * NumberOfSections / 360.0);
Однако, ваше колесо кажется повернутым относительно цветового круга C #.
Вам, вероятно, нужно вычесть постоянный угол, который является точной разницей.
Если я не ошибаюсь, разница составляет 180 °.
public static double GetMyHue(int rgb)
{
return (GetHue(rgb) + 180.0) % 360.0;
}