Algorithm to convert any positive integer to an RGB value

后端 未结 10 1320
没有蜡笔的小新
没有蜡笔的小新 2020-12-04 13:49

We have a heatmap we want to display. The numbers that will make up the values being displayed are unknown (except that they will be positive integers). The range of numbers

10条回答
  •  一个人的身影
    2020-12-04 14:13

    Simple algorithm

    // given a max and min value
    float red,green,blue;
    float range=max-min;
    float mid=(max+min)/2.0;
    
    //foreach value
        red = (value[ii]-mid)/range;            
        if (red>0.0) {
            //above mid = red-green
            blue=0.0;
            green = 1.0-red;
        } else {
            // lower half green-blue
            blue=-red;
            green = 1.0-blue;
            red=0.0;
        }
    
    }
    

    More complex:
    If your range is a few million but most are around 0 you want to scale it so that 'red' in the above example is the log of the distance from the midpoint. The cod eis a little more complicated if the values are +/-

    // assume equally distributed around 0 so max is the largest (or most negative number)
    float range = log(fabs(max));
    float mid=0.0
    
    // foreach value
    if (value[ii] > 0.0 ) {
        // above mid = red-green
        red = log(value[ii])/range;
        blue=0.0;
        green = 1.0 - red;
    } else {
        // below mid = green-blue
        blue=-log(value[ii])/range;
        green = 1.0 - blue;
       red = 0.0;
    }
    

    note - I haven't tested this code, just spinning ideas!

提交回复
热议问题