使用方法参数计算随机颜色

时间:2011-09-13 11:41:35

标签: c# .net random colors system.drawing

我有方法,用于生成随机颜色。 如果传递的参数相等,此方法有3个参数,结果颜色应该相等。 请帮我找一下计算随机颜色的公式(一些表达式)。

 protected static string RandomColor(int metaDataId, int operationId, int dataType)
        {
            var names = (KnownColor[])Enum.GetValues(typeof(KnownColor));

            metaDataId = Math.Abs(metaDataId); // metaDataId = {1...N}
            operationId = Math.Abs(operationId);// operationId = {1...N}
            dataType = Math.Abs(dataType);// dataType = {1..6}

            var colorsCount = names.Length;
            var seed = /* some operations for generating Random color */;
            var randomGen = new Random(seed);

            Color randomColor;
            while (true)
            {
                var randomColorName = names[randomGen.Next(names.Length)];
                randomColor = Color.FromKnownColor(randomColorName);
                var brightness = randomColor.GetBrightness();
                if (brightness < 0.7 && brightness > 0.2)
                {
                    break;
                }
            }
            return ColorTranslator.ToHtml(randomColor);
        }

2 个答案:

答案 0 :(得分:0)

颜色基本上由4个字节组成:红色,绿色,蓝色和alpha。如果您的3个整数类型参数永远不会超过byte.MaxValue,那么您可以使用Color.FromRgb分别为这些颜色的红色/绿色/蓝色字节应用这3个参数。

答案 1 :(得分:0)

您不需要随机颜色,而是需要从值到颜色的确定性(可能是非线性)映射。而不是使用随机,为什么不使用另一种算法将值转换为索引,但是以非线性方式。

protected static string RandomColor(int metaDataId, int operationId, int dataType)
{
    var names = (KnownColor[])Enum.GetValues(typeof(KnownColor));

    metaDataId = Math.Abs(metaDataId);
    operationId = Math.Abs(operationId);
    dataType = Math.Abs(dataType);

    // compute a hash of the 3 values modulo the number of colors
    unchecked
    {
        var index = (17 + metaDataId * 23 + operationId * 23 + dataType * 23) % names.Length;
    }

    Color color;
    while (true)
    {
        var colorName = names[index];
        color = Color.FromKnownColor(randomColorName);
        var brightness = randomColor.GetBrightness();
        if (brightness < 0.7 && brightness > 0.2)
        {
            break;
        }
        ++index;
    }
    return ColorTranslator.ToHtml(color);
}