Интересно, что вторая добавленная вами ссылка содержит изображение цветовой модели Иттена, но на самом деле для расчетов используется HSB.
Однако похоже, что вы хотите иметь возможность конвертировать значение «Оттенок» HSV из цветового круга HSV в цветовой круг Иттена следующим образом:
Вы можете видеть, что на первом колесе значения красного, синего и зеленого цвета составляют 0, 120 и 240 градусов соответственно. На втором - красный, желтый и синий в одних и тех же местах. Итак, что вам нужно сделать, это преобразовать из RGB в RYB. Вот моя реализация на C#, в основном взято отсюда (все скопировано сюда на случай, если источник однажды выйдет из строя)::
private Vector3 RYBToHSV(Vector3 color)
{
float r = color[0], y = color[1], b = color[2];
float mx = Mathf.Max(r, y, b);
float mn = Mathf.Min(r, y, b);
float df = mx - mn;
float h, s, v;
if (mx == mn)
{
h = 0.0f;
}
else if (mx == r)
{
h = (60.0f * ((y - b) / df) + 360.0f) % 360.0f;
}
else if (mx == y)
{
h = (60.0f * ((b - r) / df) + 120.0f) % 360.0f;
}
else if (mx == b)
{
h = (60.0f * ((r - y) / df) + 240.0f) % 360.0f;
}
else
{
h = 0;
}
if (mx == 0f)
{
s = 0.0f;
}
else
{
s = (df / mx) * 100.0f;
}
v = mx * 100.0f;
return new Vector3(h / 360.0f, s / 100.0f, v / 100.0f);
}
Но это дает вам только RYB, который, хотя и полезен для операций, основанных на цветовом круге Иттена, сам по себе бесполезен. Итак, что я сделал, так это конвертировал в HSV, что можно легко сделать, используя любую стандартную функцию RGB в HSV, но где вы передаете «Y» вместо «G».
Реализация C#, опять же полностью взятая отсюда, возможно, вам придется отредактировать ее, чтобы она работала для ваших целей:
private Color RGBToRYB(Color color)
{
// Remove the white from the color
float iWhite = Mathf.Min(color.r, color.g, color.b);
float iRed = color.r - iWhite;
float iGreen = color.g - iWhite;
float iBlue = color.b - iWhite;
float iMaxGreen = Mathf.Max(iRed, iGreen, iBlue);
// Get the yellow out of the red+green
float iYellow = Mathf.Min(iRed, iGreen);
iRed -= iYellow;
iGreen -= iYellow;
// If this unfortunate conversion combines blue and green, then cut each in half to
// preserve the value's maximum range.
if (iBlue > 0f && iGreen > 0f)
{
iBlue /= 2f;
iGreen /= 2f;
}
// Redistribute the remaining green.
iYellow += iGreen;
iBlue += iGreen;
// Normalize to values.
float iMaxYellow = Mathf.Max(iRed, iYellow, iBlue);
if (iMaxYellow > 0f)
{
float iN = iMaxGreen / iMaxYellow;
iRed *= iN;
iYellow *= iN;
iBlue *= iN;
}
// Add the white back in.
iRed += iWhite;
iYellow += iWhite;
iBlue += iWhite;
return (new Color(iRed, iYellow, iBlue));
}