如何修改红-绿热力图代码实现红-黄-绿-蓝彩虹色热力图?
问题描述
现有一段可生成红-绿色谱热力图的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
相关产品推荐
相关产品推荐

