我需要颜色数学方面的帮助。我有一种主色,我需要得到其他颜色的选择和谐。 我需要这样的色彩和谐:triada,补充,类似,单色。我在C#中需要它们。 任何帮助表示赞赏。 谢谢, 迪马。
答案 0 :(得分:3)
好的,一切都围绕着link中描述的色轮。我建议在阵列中硬编码这些颜色。我假设你的主色总是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)] };
}
由于我不知道单色的定义,我会留给你。 :)
编辑:如果你想让它适用于任何颜色,那么我不是百分百肯定,但我有一个想法。
该网站表示通过在RYB颜色空间中拾取颜色(而不是C#使用的RGB颜色)来创建滚轮。因此,大概你可以弄清楚你的颜色与车轮上的每种颜色的距离(通过将两者转换为RYB并进行比较),然后使用我的函数来获得其他颜色。最后添加颜色与最接近的轮颜色(在RYB颜色空间中)之间的差异,最后转换回RGB以存储为Color对象。