2011-09-13 2 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

색상은 기본적으로 빨강, 초록, 파랑 ​​및 알파로 구성됩니다. 3 정수형 매개 변수가 결코 byte.MaxValue를 초과하지 않으면 예를 들어 Color.FromRgb을 사용하여 색상의 빨강/녹색/파랑 바이트에 해당하는 3 개의 매개 변수를 적용 할 수 있습니다.