如何根据点生成热图

oli*_*ive 7 .net c#

我想以windows形式生成热图.我有一组点作为输入.如何以最简单的方式做到这一点?谢谢.

Sam*_*Sam 6

这是一个简单的方法,它将根据min和max之间的值的相对位置生成颜色.接近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
   };
}
Run Code Online (Sandbox Code Playgroud)

  • 您的代码不是在Windows窗体应用程序中构建的.ARGB字段仅准备就绪.Color是一个Struct,ARGB只有get方法. (2认同)

Cur*_*ite 5

这是对 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);                                    
    }
Run Code Online (Sandbox Code Playgroud)

  • 在 Windows 窗体中,Sam 的代码无法运行。ARGB 字段仅准备就绪。 (2认同)

Mat*_*att 5

基于此处已有的答案,此方法允许您指定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);
}
Run Code Online (Sandbox Code Playgroud)

对于DataGrid带有一些样本数据的测试,结果看起来像这样.

在此输入图像描述


Rob*_*sor 2

将表面划分为单元格网格,并计算每个单元格内的点。

给定点数,计算每个单元格的颜色