我正在用C/C++移植一段MATLAB代码,我需要将图中的许多RGB颜色映射到整数区间.
设[-1; 1]是函数可以有一个值的区间,我需要将-1和它下面的任何数字映射到一个颜色,+ 1和它上面的任何数字到另一个颜色,-1和-1之间的任何数字+1到边界之间的另一种颜色.显然数字是无限的,所以我并不担心我将要绘制多少颜色,但如果我能在其中映射至少40-50种颜色,那将会很棒.
我想将[-1; 1]区间细分为X个子区间,并将它们中的每一个映射为RGB颜色,但这听起来像是一个非常枯燥乏味的工作.
有没有其他方法来实现这一目标?如果没有,我应该如何在C/C++中做到这一点?
如果性能不是问题,那么我会做类似于高性能标记建议的事情,除了可以在HSV颜色空间中进行:将S和V值固定在最大值并在特定范围内线性地改变H值:
s = 1.0; v = 1.0;
if(x <= -1){h = h_min;}
else if(x >= 1){h = h_max;}
else {h = h_min + (h_max - h_min)*0.5*(x + 1.0);}
// then convert h, s, v back to r, g, b - see the wikipedia link
Run Code Online (Sandbox Code Playgroud)
如果性能是一个问题(例如,您尝试实时处理视频或其他内容),则提前计算rgb值并将其作为数组从文件加载.然后简单地将值映射x到索引:
int r, g, b;
int R[NUM_COLORS];
int G[NUM_COLORS];
int B[NUM_COLORS];
// load R, G, B from a file, or define them in a header file, etc
unsigned int i = 0.5*(x + 1.0);
i = MIN(NUM_COLORS-1, i);
r = R[i]; g = G[i]; b = B[i];
Run Code Online (Sandbox Code Playgroud)