【问题标题】:Calculate Random color with method parameters使用方法参数计算随机颜色
【发布时间】:2011-11-16 02:34:04
【问题描述】:

我有生成随机颜色的方法。 此方法有 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);
        }

【问题讨论】:

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


    【解决方案1】:

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

    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);
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-02-26
        • 1970-01-01
        • 2013-04-05
        • 2018-03-18
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 2018-05-16
        • 2016-07-05
        相关资源
        最近更新 更多