2011-03-18 54 views

回答

2

將表面分成單元網格,並計算每個單元格內的點。

給定點數,計算每個單元的顏色

6

這是一個簡單的方法,將根據最小值和最大值之間的值的相對位置生成顏色。接近min的值會更綠,而接近max的值會更紅。
要使用此方法,請生成值列表並計算最小值和最大值。如果你正在構建一個網格,你可以處理RowDataBound事件或類似的東西,並從那裏調用HeatMap方法。獲取對單元格的引用,並將背景顏色設置爲由HeatMap方法返回的顏色。

public Color HeatMap(decimal value, decimal min, decimal max) 
{ 
    decimal val = (value - min)/(max-min); 
    return new Color 
    { 
     A = 255, 
     R = Convert.ToByte(255 * val), 
     G = Convert.ToByte(255 * (1-val)), 
     B = 0 
    }; 
} 
+0

柯蒂斯,那麼你的補丁修復?我發佈的代碼是intentally稀疏,但它運行(在WPF中)。 – Sam 2012-07-21 00:24:50

+2

您的代碼不在Windows窗體應用程序中生成。 ARGB字段僅準備好。顏色是一個結構和ARGB只有獲得方法。 – 2014-06-03 21:58:41

2

這是修復Sam的代碼。在答案已經在這裏

public Color HeatMapColor(decimal value, decimal min, decimal max) 
    { 
     decimal val = (value - min)/(max - min); 
     int r = Convert.ToByte(255 * val); 
     int g = Convert.ToByte(255 * (1 - val)); 
     int b = 0; 

     return Color.FromArgb(255,r,g,b);          
    } 
+0

和[Sam's answer](http://stackoverflow.com/a/11570954/947171)有何不同? – 2014-03-14 20:08:34

+2

在Windows窗體中,Sam的代碼無法運行。 ARGB字段僅準備好。 – 2014-06-03 21:58:19

4

大廈,該方法允許你指定Colors你想爲最大值和最小值的顏色使用。

private Color HeatMapColor(double value, double min, double max) 
{ 
    Color firstColour = Color.RoyalBlue; 
    Color secondColour = Color.LightSkyBlue; 

    // Example: Take the RGB 
    //135-206-250 // Light Sky Blue 
    // 65-105-225 // Royal Blue 
    // 70-101-25 // Delta 

    int rOffset = Math.Max(firstColour.R, secondColour.R); 
    int gOffset = Math.Max(firstColour.G, secondColour.G); 
    int bOffset = Math.Max(firstColour.B, secondColour.B); 

    int deltaR = Math.Abs(firstColour.R - secondColour.R); 
    int deltaG = Math.Abs(firstColour.G - secondColour.G); 
    int deltaB = Math.Abs(firstColour.B - secondColour.B); 

    double val = (value - min)/(max - min); 
    int r = rOffset - Convert.ToByte(deltaR * (1 - val)); 
    int g = gOffset - Convert.ToByte(deltaG * (1 - val)); 
    int b = bOffset - Convert.ToByte(deltaB * (1 - val));   

    return Color.FromArgb(255, r, g, b); 
} 

結果看起來像這樣的測試DataGrid與一些示例數據。

enter image description here

+0

如果我使用以下顏色 顏色firstColour = Color.Blue; 顏色secondColour = Color.Yellow; 我只是得到灰色陰影 – Chris 2014-11-30 20:31:47

0

溶液從紅色去黃綠色

static Color CreateHeatColor(int value, decimal max) 
    { 
     if (max == 0) max = 1M; 
     decimal pct = value/max; 
     Color color = new Color(); 

     color.A = 255; 

     if (pct < 0.34M) 
     { 
      color.R = (byte) (128 + (127 * Math.Min(3 * pct, 1M))); 
      color.G = 0; 
      color.B = 0; 
     } 
     else if (pct < 0.67M) 
     { 
      color.R = 255; 
      color.G = (byte) (255 * Math.Min(3 * (pct - 0.333333M), 1M)); 
      color.B = 0; 
     } 
     else 
     { 
      color.R = (byte)(255 * Math.Min(3 * (1M - pct), 1M)); 
      color.G = 255; 
      color.B = 0; 
     } 

     return color; 
    } 
0

這對我行之有效。

public Color HeatMap(float value, float max) 
    { 
     int r, g, b; 
     float val = value/max; // Assuming that range starts from 0 
     if (val > 1) 
      val = 1; 
     if (val > 0.5f) 
     { 
      val = (val - 0.5f) * 2; 
      r = Convert.ToByte(255 * val); 
      g = Convert.ToByte(255 * (1 - val)); 
      b = 0; 
     } 
     else 
     { 
      val = val * 2; 
      r = 0; 
      g = Convert.ToByte(255 * val); 
      b = Convert.ToByte(255 * (1 - val)); 
     } 
     return Color.FromArgb(255, r, g, b); 
    } 
0

如果你想通過黃色變爲綠色,也可以使用HSL來獲取熱圖。在這種情況下的數字是0-60,其中0 =紅色和60 =綠色(see figure 11 on this link)。

要實現,你需要使用System.Runtime.InteropServices並添加以下內容:

[DllImport("shlwapi.dll")] 
public static extern int ColorHLSToRGB(int H, int L, int S); 

在該方法中,VAL是一個長期的價值和m_iMax是集合中的數量最多,你可以改變它根據需要:

if (val == 0) 
    return ColorTranslator.ToHtml(Color.FromArgb(255, 255, 255)); // white 
else 
{ 
    // 0 = red, 60 = green 
    int col = 60 - (int)(60 * val/m_iMax); 

    return ColorTranslator.ToHtml(ColorTranslator.FromWin32(ColorHLSToRGB(col, 120, 240))); 
} 

下面是一個HTML表格上方的代碼的結果:

Heatmap

0

「柯蒂斯白」 的回答的C#版本:

public Color HeatMap(decimal value, decimal min, decimal max) 
     { 
      decimal val = (value - min)/(max - min); 
      int A, B, R, G; 
      A = 255; 
      R = Convert.ToByte(255 * val); 
      B = Convert.ToByte(255 * (1 - val)); 
      G = 0; 
      return Color.FromArgb(A, R, G, B); 
     }