Разбиение цветового круга на разделы - PullRequest
0 голосов
/ 01 сентября 2011

Как я могу программно разделить цветовой круг на секции, и как я могу получить все цвета RGB в этих секциях?

Color Circle

Я хочу, чтобы fce возвращала мне секцию цветавходным параметром в цвете RGB.

int getColorSection(RGB color);

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

Не знаю, правильно ли я понял вопрос, но думаю, вы спрашиваете, является ли цвет более зеленым, более синим или синим красным? Это даст вам информацию о том, в каком разделе (красный, зеленый или синий) он находится.

Для этого без учета человеческого восприятия цветов вы можете сделать:

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;
    }
2 голосов
/ 01 сентября 2011

Используйте цветовое пространство HSL.H - это оттенок, угол цвета на цветовом круге.Вы можете получить его напрямую из метода System.Drawing.Color.GetHue ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...