好的,一切都围绕着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)] };
}
由于我不知道单色的定义,我将把它留给你。 :)
编辑:如果您希望它适用于任何颜色,那么我不能 100% 确定,但我有一个想法。
该网站说轮子是通过在 RYB 颜色空间(不是 C# 使用的 RGB 空间)中选择颜色来创建的。因此,大概您可以计算出您的颜色与轮盘上每种颜色的“距离”(通过将两者都转换为 RYB 并进行比较),然后使用我的函数来获取其他颜色。最后将您的颜色与最接近的车轮颜色(在 RYB 颜色空间中)之间的差异添加到每个结果中,最后转换回 RGB 以存储为 Color 对象。