You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改红-绿热力图代码实现红-黄-绿-蓝彩虹色热力图?

问题描述

现有一段可生成红-绿色谱热力图的C#函数,运行效果良好。现需将其修改为可生成从红色经黄色、绿色过渡至蓝色的彩虹色热力图,请问该如何调整以下代码?

public Color HeatMapColor(double value, double min, double max)
{
    if (value < min)
    {
        return Color.LightGray;
    }
    else if (value > max)
    {
        return Color.Black;
    }
    else
    {
        try
        {
            double val = (value - min) / (max - min);

            int r = System.Convert.ToInt32(System.Math.Floor(255 * val));
            int g = System.Convert.ToInt32(System.Math.Floor(255 * (1 - val)));
            int b = 0;

            if (r > 255 || r < 0)
                r = 255;
            if (g > 255 || g < 0) g = 255;
            else if (b > 255 || b < 0) b = 255;

            return Color.FromArgb(255, r, g, b);
        } 
        catch (OverflowException)
        {
            return Color.FromArgb(255, 255, 255, 255);
        }
    }
}
修改方案

原代码仅实现了红-绿两色过渡,要实现红→黄→绿→蓝的彩虹渐变,需将归一化后的val(范围0~1)划分为三个区间,分别控制RGB通道的变化逻辑:

  • 红→黄(val ∈ [0, 1/3]):红色保持最大值255,绿色从0逐步升至255,蓝色保持0
  • 黄→绿(val ∈ [1/3, 2/3]):绿色保持最大值255,红色从255逐步降至0,蓝色保持0
  • 绿→蓝(val ∈ [2/3, 1]):蓝色从0逐步升至255,绿色从255逐步降至0,红色保持0

同时修正原代码中边界判断的逻辑错误,改用Math.Clamp更简洁可靠地确保RGB值在0~255范围内。修改后的代码如下:

public Color HeatMapColor(double value, double min, double max)
{
    if (value < min)
    {
        return Color.LightGray;
    }
    else if (value > max)
    {
        return Color.Black;
    }
    else
    {
        try
        {
            double val = (value - min) / (max - min);
            int r, g, b;

            // 分三段实现红→黄→绿→蓝的平滑渐变
            if (val <= 1.0 / 3)
            {
                double segmentVal = val * 3;
                r = 255;
                g = (int)Math.Floor(255 * segmentVal);
                b = 0;
            }
            else if (val <= 2.0 / 3)
            {
                double segmentVal = (val - 1.0 / 3) * 3;
                r = (int)Math.Floor(255 * (1 - segmentVal));
                g = 255;
                b = 0;
            }
            else
            {
                double segmentVal = (val - 2.0 / 3) * 3;
                r = 0;
                g = (int)Math.Floor(255 * (1 - segmentVal));
                b = (int)Math.Floor(255 * segmentVal);
            }

            // 确保RGB值在合法范围内
            r = Math.Clamp(r, 0, 255);
            g = Math.Clamp(g, 0, 255);
            b = Math.Clamp(b, 0, 255);

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

内容的提问来源于stack exchange,提问作者Simon Giesen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:35:23