C# 如何随机生成彼此易于识别的颜色?
我想为图形图表生成随机颜色,但我尝试的是不可识别的,生成的颜色通常彼此相似。有可能创造出这样的颜色吗 我的方法:C# 如何随机生成彼此易于识别的颜色?,c#,winforms,random,colors,C#,Winforms,Random,Colors,我想为图形图表生成随机颜色,但我尝试的是不可识别的,生成的颜色通常彼此相似。有可能创造出这样的颜色吗 我的方法: public Color[] GenerateColors(int n) { Color[] colors = new Color[n]; for (int i = 0; i < n; i++) { int R = rnd.Next(0, 250); int G =
public Color[] GenerateColors(int n)
{
Color[] colors = new Color[n];
for (int i = 0; i < n; i++)
{
int R = rnd.Next(0, 250);
int G = rnd.Next(0, 250);
int B = rnd.Next(0, 250);
Color color = Color.FromArgb(R, G, B);
colors[i] = color;
}
return colors;
}
public Color[]生成颜色(int n)
{
颜色[]颜色=新颜色[n];
对于(int i=0;i
这里有一个randomColor
类,它结合了来自和的建议。根据要生成的颜色数量,方法generate
可以从KnownColors
中拾取颜色,也可以在使用最后一种颜色作为混合颜色的位置生成随机新颜色
public class RandomColors
{
static Color lastColor = Color.Empty;
static KnownColor[] colorValues = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
static Random rnd = new Random();
const int MaxColor = 256;
static RandomColors()
{
lastColor = Color.FromArgb(rnd.Next(MaxColor), rnd.Next(MaxColor), rnd.Next(MaxColor));
}
public static Color[] Generate(int n)
{
var colors = new Color[n];
if (n <= colorValues.Length)
{
// known color suggestion from TAW
// https://stackoverflow.com/questions/37234131/how-to-generate-randomly-colors-that-is-easily-recognizable-from-each-other#comment61999963_37234131
var step = (colorValues.Length-1) / n;
var colorIndex = step;
step = step == 0 ? 1 : step; // hacky
for(int i=0; i<n; i++ )
{
colors[i] = Color.FromKnownColor(colorValues[colorIndex]);
colorIndex += step;
}
} else
{
for(int i=0; i<n; i++)
{
colors[i] = GetNext();
}
}
return colors;
}
public static Color GetNext()
{
// use the previous value as a mix color as demonstrated by David Crow
// https://stackoverflow.com/a/43235/578411
Color nextColor = Color.FromArgb(
(rnd.Next(MaxColor) + lastColor.R)/2,
(rnd.Next(MaxColor) + lastColor.G)/2,
(rnd.Next(MaxColor) + lastColor.B)/2
);
lastColor = nextColor;
return nextColor;
}
}
公共类随机颜色
{
静态颜色lastColor=Color.Empty;
静态KnownColor[]colorValues=(KnownColor[])Enum.GetValues(typeof(KnownColor));
静态随机rnd=新随机();
常量int MaxColor=256;
静态随机颜色()
{
lastColor=Color.FromArgb(rnd.Next(MaxColor)、rnd.Next(MaxColor)、rnd.Next(MaxColor));
}
公共静态颜色[]生成(int n)
{
var colors=新颜色[n];
如果(n在这种情况下,你最好不要使用随机的,而是某种类型的图案来讨论颜色距离。也要看看!这里和这里都有一些想法,谢谢,@OldBoyCoder这篇文章很好地解释了这个问题,并给出了一个很好的解决方案。根据你需要多少颜色,你可以对它们进行硬编码sed用于为数据表示生成易于区分的配色方案。选择数据的性质,选择数据类的数量,最后选择您喜欢的配色方案/调色板。复制这些十六进制值,将它们存储在列表或数组中,获利!