将颜色映射到间隔

3 c c++ math colors

我正在用C/C++移植一段MATLAB代码,我需要将图中的许多RGB颜色映射到整数区间.

设[-1; 1]是函数可以有一个值的区间,我需要将-1和它下面的任何数字映射到一个颜色,+ 1和它上面的任何数字到另一个颜色,-1和-1之间的任何数字+1到边界之间的另一种颜色.显然数字是无限的,所以我并不担心我将要绘制多少颜色,但如果我能在其中映射至少40-50种颜色,那将会很棒.

我想将[-1; 1]区间细分为X个子区间,并将它们中的每一个映射为RGB颜色,但这听起来像是一个非常枯燥乏味的工作.

有没有其他方法来实现这一目标?如果没有,我应该如何在C/C++中做到这一点?

dan*_*ain 5

如果性能不是问题,那么我会做类似于高性能标记建议的事情,除了可以在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)

  • HSV几乎是以编程方式操作颜色而不会疯狂的标准选择. (2认同)