-1

下面的函数有一个问题,虽然它会产生明显的纯色,但不能保证 2 个颜色代码的可区分差异。

private Color[] GenerateNewColor(int count) 
{ 
    Color[] colors=new Color[count*2]; 
    for (int i = 0; i < count*2; i++) 
    { 
        var values = Guid.NewGuid().ToByteArray().Select(b => (int) b); 
        int red = values.Take(5).Sum()%255; 
        int green = values.Skip(5).Take(5).Sum()%255; 
        int blue = values.Skip(10).Take(5).Sum()%255; 
        // 
        colors[i] = Color.FromArgb(255, red, green, blue); 
    } 
    HashSet<Color> hashedcolors=new HashSet<Color>(colors); 
    return hashedcolors.ToArray(); 
}

下面的函数会将颜色代码从#000000 平均分配到#ffffff,但它不能保证纯色。此外,如果颜色的数量少于 5 种,那么它只会生成黑色的阴影

private string[] GenerateNewColorByAdding(int count) 
{ 
    long hexmin=0X000000; 
    long hexmax = 0XFFFFFF; 
    long adder = Convert.ToInt64(hexmax)/count; 
    string[] s=new string[count]; 
    for (int i = 0; i < count; i++) 
    { 
        hexmin = hexmin + adder; 
        s[i] = String.Format("#{0:X6}" ,hexmin); 
    } 
    return s;   
}

所以我想得到n个纯色,每个都应该是彼此不同的可见性。

示例:如果 n=50 要求 1:50 应生成纯色(无透明度)。要求 2:它们中的每一个都应该明显不同,例如:红色、绿色、蓝色、橙色......等,

注意:这里的“n”最多可以是 100。

4

1 回答 1

0

由于存在三个独立变量(红色、绿色和蓝色),您可以取所需不同颜色数量的立方根,并使用它来组合红色、绿色和蓝色中的每一个值,以给出所需数量的颜色。

也许这样的事情对你有用:

public IEnumerable<Color> DistinctColors(int n)
{
    int m = (int)Math.Ceiling(Math.Pow(n, 1/3.0));

    for (int green = 0; green <= m; ++green)
    {
        for (int blue = 0; blue <= m; ++blue)
        {
            for (int red = 0; red <= m; ++red)
            {
                if (n-- == 0)
                    yield break;

                int r = (int)(0.5 + red*255.0/m);
                int g = (int)(0.5 + green*255.0/m);
                int b = (int)(0.5 + blue*255.0/m);

                yield return Color.FromArgb(r, g, b);
            }
        }
    }
}

[编辑] 更改了 RGB 生成的顺序,这样通常会生成比绿色更多的红色阴影(因为这似乎会产生更好的结果)。

于 2013-11-06T13:20:16.823 回答