Хорошо, все вращается вокруг цветового круга, описанного в вашей ссылке . Я предлагаю жестко кодировать эти цвета в массиве. Я предполагаю, что ваш основной цвет всегда один из тех 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.