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

基于等高线海拔生成颜色渐变的算法优化求助

等高线颜色渐变解决方案

问题分析

你之前的代码仅通过统一降低RGB值生成渐变,这种方式只适合绿色这类单一色系的过渡,对麦黄、褐色这类复合色系会导致颜色偏灰暗失真,白色区间也无法体现从浅到深的自然过渡。正确的思路是为每个海拔区间定义首尾色,通过区间内的颜色插值生成对应海拔的颜色。

实现方案

1. 定义海拔-颜色区间配置

先为每个地形区间明确起始色(对应区间最低海拔)和结束色(对应区间最高海拔),使用十六进制色码保证颜色精准:

public struct ElevationColorRange
{
    public int MinElevation;
    public int MaxElevation;
    public Color StartColor;
    public Color EndColor;
}

// 预设地形颜色区间(可根据需求调整色值)
private static readonly List<ElevationColorRange> _terrainColorRanges = new List<ElevationColorRange>
{
    // 低地:0-15 浅绿 → 深绿
    new() { MinElevation = 0, MaxElevation = 15, StartColor = Color.FromArgb(0x88, 0xD8, 0x88), EndColor = Color.FromArgb(0x2D, 0x88, 0x2D) },
    // 中地:16-30 浅麦黄 → 深麦黄
    new() { MinElevation = 16, MaxElevation = 30, StartColor = Color.FromArgb(0xFF, 0xE8, 0x88), EndColor = Color.FromArgb(0xD8, 0xB0, 0x30) },
    // 高地:31-40 浅褐色 → 深褐色
    new() { MinElevation = 31, MaxElevation = 40, StartColor = Color.FromArgb(0xD8, 0xA0, 0x60), EndColor = Color.FromArgb(0x88, 0x50, 0x2D) },
    // 山顶:41-50 浅灰白 → 雪白色
    new() { MinElevation = 41, MaxElevation = 50, StartColor = Color.FromArgb(0xF0, 0xF0, 0xF0), EndColor = Color.FromArgb(0xFF, 0xFF, 0xFF) }
};

2. 颜色插值方法

通过计算海拔在区间内的相对比例,对首尾色的RGB分量分别插值,生成自然过渡的颜色:

private static Color InterpolateColor(Color startColor, Color endColor, double fraction)
{
    // fraction取值0-1,0对应起始色,1对应结束色
    int red = (int)Math.Round(startColor.R + (endColor.R - startColor.R) * fraction);
    int green = (int)Math.Round(startColor.G + (endColor.G - startColor.G) * fraction);
    int blue = (int)Math.Round(startColor.B + (endColor.B - startColor.B) * fraction);
    
    return Color.FromArgb(red, green, blue);
}

3. 根据海拔获取对应颜色

匹配海拔所属区间,计算相对比例后调用插值方法:

public static Color GetContourColor(int elevation)
{
    foreach (var range in _terrainColorRanges)
    {
        if (elevation >= range.MinElevation && elevation <= range.MaxElevation)
        {
            double relativePosition = (double)(elevation - range.MinElevation) / (range.MaxElevation - range.MinElevation);
            return InterpolateColor(range.StartColor, range.EndColor, relativePosition);
        }
    }
    
    // 处理超出0-50范围的海拔,默认返回白色
    return Color.White;
}

4. 生成全海拔颜色映射(可选)

如果需要一次性获取0-50所有海拔的颜色,可使用以下方法:

public static Dictionary<int, Color> GetAllElevationColorMap()
{
    var colorMap = new Dictionary<int, Color>();
    for (int elevation = 0; elevation <= 50; elevation++)
    {
        colorMap[elevation] = GetContourColor(elevation);
    }
    return colorMap;
}

效果说明

这个方案通过区间双色插值,确保每个地形区间的颜色渐变符合视觉逻辑:低地从嫩绿到深绿,中地从浅黄到土黄,高地从浅褐到深褐,山顶从灰白到纯白,完全匹配你定义的海拔区间要求。

内容的提问来源于stack exchange,提问作者Jakub Sluka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:40:20