2011-03-06 32 views
0

我想了解如何在C#中完成以下任務。我想繪製一個「顏色」,確切的顏色將由屬性值決定,爲了這個例子,我們假設它是一個百分比。C#不同值的色調

理想情況下,我希望用戶指定五種顏色。

Negative MAX 
    Negative MIN 
    Even 
    Positive MIN 
    Positive MAX 

用戶只爲每個級別指定顏色,而不是確定Min和Max的值。

使用此數據,我希望能夠根據百分比計算顏色。即57%會導致Positive MIN和Positive MAX之間的色調。任何幫助或建議,這是表示讚賞。

+1

請清除你的問題,我真的不明白你在問什麼! – TDaver 2011-03-06 14:50:53

+0

希望能夠解釋我之後的事情。如果還有不清楚的地方請讓我知道。 – Kasy 2011-03-06 14:53:01

+0

這看起來是回答,你還需要別的嗎? – 2011-03-13 22:06:18

回答

0

兩種顏色之間插入你剛纔插每個顏色通道

Color color1 = Color.Red; 
Color color2 = Color.Green; 
double fraction = 0.3; 
Color color3 = Color.FromArgb(
    (int)(color1.R * fraction + color2.R * (1 - fraction)), 
    (int)(color1.G * fraction + color2.G * (1 - fraction)), 
    (int)(color1.B * fraction + color2.B * (1 - fraction))); 

沿着你的規模內插,你需要決定什麼確切的百分比值你的「措施」有和項目目標值兩者之間的分數那些顏色步驟。

0

使用複製的功能from here,您可以將色調轉換回RGB顏色。這個函數假設所有的輸入和輸出都是0..1的比例,所以你需要用color.GetHue()除以255.在函數的下面是一些使用一組百分比的示例代碼;在您選擇的用戶界面中實施DisplayColor以查看結果。

public static void HSVToRGB(double H, double S, double V, out double R, out double G, out double B) 
{ 
    if (H == 1.0) 
    { 
     H = 0.0; 
    } 

    double step = 1.0/6.0; 
    double vh = H/step; 

    int i = (int) System.Math.Floor(vh); 

    double f = vh - i; 
    double p = V*(1.0 - S); 
    double q = V*(1.0 - (S*f)); 
    double t = V*(1.0 - (S*(1.0 - f))); 

    switch (i) 
    { 
     case 0: 
      { 
       R = V; 
       G = t; 
       B = p; 
       break; 
      } 
     case 1: 
      { 
       R = q; 
       G = V; 
       B = p; 
       break; 
      } 
     case 2: 
      { 
       R = p; 
       G = V; 
       B = t; 
       break; 
      } 
     case 3: 
      { 
       R = p; 
       G = q; 
       B = V; 
       break; 
      } 
     case 4: 
      { 
       R = t; 
       G = p; 
       B = V; 
       break; 
      } 
     case 5: 
      { 
       R = V; 
       G = p; 
       B = q; 
       break; 
      } 
     default: 
      { 
       // not possible - if we get here it is an internal error 
       throw new ArgumentException(); 
      } 
    } 
} 

Color min = Color.Blue; 
Color max = Color.Green; 

float minHue = min.GetHue()/255; 
float maxHue = max.GetHue()/255; 

float scale = maxHue - minHue; 

float[] percents = new float[] { .05F, .15F, .40F, .70F, .85F, .95F }; 

foreach (var pct in percents) { 
    float curHue = minHue + (scale * pct); 
    double r, g, b; 
    HSVToRGB(curHue, 1.0, 1.0, out r, out g, out b); 

    Color curColor = Color.FromArgb((int)(r * 255), (int)(g * 255), (int)(b * 255)); 
    DisplayColor(curColor); 
} 
+0

應該注意一些最小/最大顏色會導致比例大於1,這讓我覺得有些東西不太對,但是這與您正在尋找的東西非常接近。 – TheXenocide 2012-10-05 20:43:57