Цветовые гармонии: триада, дополнение, аналог, монохромат - PullRequest
1 голос
/ 11 мая 2011

Мне нужна помощь в цветной математике.У меня есть один основной цвет, и мне нужно получить другие цвета выбранной гармонии.Мне нужны такие цветовые гармонии: триада, дополнение, аналог, монохроматика.Мне они нужны в C #.Любая помощь приветствуется.Спасибо, Дима.

1 Ответ

3 голосов
/ 11 мая 2011

Хорошо, все вращается вокруг цветового круга, описанного в вашей ссылке . Я предлагаю жестко кодировать эти цвета в массиве. Я предполагаю, что ваш основной цвет всегда один из тех 12.

Один вспомогательный метод, который нам понадобится, - это метод, который обернет значения вокруг массива, так что цвет -1 станет цветом 12 (индекс 11 в массиве):

int WrapColor(int colorIndex, int numWheelColors)
{
    while(colorIndex < 0)
    {
        colorIndex += numWheelColors;
    }

    colorIndex = colorIndex % numWheelColors;
}

Нам также нужен вспомогательный метод, который получит индекс цвета на цветовом круге:

int GetColorWheelIndex(Color color)
{
    if (ColorWheelArray.Contains(color))
        return ColorWheelArray.IndexOf(color);
    else
        throw new InvalidArgumentException("color");
}

Теперь все на месте (при условии, что у вас есть массив ColorWheelArray, содержащий цвета в порядке ).

Триада:

Color[] GetTriadaColors(Color color)
{
    int colorIndex = GetColorWheelIndex(color, ColorWheelArray.Length);
    return new Color[]
        {
            color,
            ColorWheelArray[WrapColor(colorIndex + ColorWheelArray.Length / 3)],
            ColorWheelArray[WrapColor(colorIndex + 2 * ColorWheelArray.Length / 3)]
        };
}

Комплимент:

Color GetComplimentColor(Color color)
{
    int colorIndex = GetColorWheelIndex(color, ColorWheelArray.Length);
    return ColorWheelArray[WrapColor(colorIndex + ColorWheelArray.Length / 2)];
}

Аналог:

Color[] GetAnalogousColors(Color color)
{
    int colorIndex = GetColorWheelIndex(color, ColorWheelArray.Length);
    return new Color[] { color,
                         ColorWheelArray[WrapColor(colorIndex + 1)],
                         ColorWheelArray[WrapColor(colorIndex + 2)] };
}

Поскольку я не знаю определения монохроматического, я оставлю это вам. :)


РЕДАКТИРОВАТЬ: Если вы хотите, чтобы он работал с любым цветом, то я не уверен на 100%, однако у меня есть идея.

На этом сайте написано, что колесо создано путем выбора цветов в цветовом пространстве RYB (а не в RGB, который использует C #). Итак, предположительно, вы могли бы определить, насколько «отдален» ваш цвет от каждого цвета на колесе (путем преобразования как в RYB, так и сравнить), а затем использовать мои функции, чтобы получить другие цвета. Наконец, добавьте разницу между вашим цветом и цветом ближайшего колеса (в цветовом пространстве RYB) к каждому результату, окончательно переведя обратно в RGB для сохранения в качестве объекта Color.

...