我有方法,用于生成随机颜色。 如果传递的参数相等,此方法有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);
}
答案 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);
}