Рассчитать случайный цвет с параметрами метода - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть метод для генерации случайных цветов. Этот метод имеет 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 голосов
/ 13 сентября 2011

Вам нужен не случайный цвет, а детерминированное (возможно, нелинейное) отображение значений на цвета.Вместо использования random, почему бы не использовать другой алгоритм для преобразования значений в индекс, но нелинейным способом.

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);
}
0 голосов
/ 13 сентября 2011

цвет в основном состоит из 4 байтов: красный, зеленый, синий и альфа. если ваши 3 параметра целочисленного типа никогда не будут превышать byte.MaxValue, то вы можете применить эти 3 параметра для красного / зеленого / синего байтов цвета соответственно, используя Color.FromRgb , например.

...