2011-09-13 8 views
0

ランダムな色を生成する方法があります。 渡されたパラメータが等しい場合、このメソッドは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

ランダムな色は必要ありませんが、値から色に決定的な(おそらく非線形の)マッピングが必要です。ランダムを使用するのではなく、別のアルゴリズムを使用して値をインデックスに変換するのではなく、非線形に変換してみましょう。

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

ありがとうございます!クール! – Nodir

0

色は基本的に赤、緑、青、アルファの4バイトで構成されています。 3つの整数型パラメータが決してbyte.MaxValueを超えない場合は、たとえば、Color.FromRgbを使用して、これらの3つのパラメータをそれぞれ赤/緑/青のバイトに適用できます。

関連する問題