颜色插值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Eigen::Vector3f colorMapping_B2R(float value, float min, float max)
{
// from blue to red
float mid1 = (max + 3 * min) / 4.0;
float mid2 = (max + min) / 2.0;
float mid3 = (3 * max + min) / 4.0;

Eigen::Vector3f color;
//Eigen::Vector3f blue = Eigen::Vector3f(0.0, 0.0, 1.0);
//Eigen::Vector3f cyan = Eigen::Vector3f(0.0, 1.0, 1.0);
//Eigen::Vector3f green = Eigen::Vector3f(0.0, 1.0, 0.0);
//Eigen::Vector3f yellow = Eigen::Vector3f(1.0, 1.0, 0.0);
//Eigen::Vector3f red = Eigen::Vector3f(1.0, 0.0, 0.0);

// blue to cyan
if (value >= min && value < mid1)
{
float temp = (value - min) / (mid1 - min);
color = Eigen::Vector3f(0.0, temp, 1.0);
}

// cyan to green
else if (value >= mid1 && value < mid2)
{
float temp = (value - mid1) / (mid2 - mid1);
color = Eigen::Vector3f(0.0, 1.0, 1.0 - temp);
}

// green to yellow
else if (value >= mid2 && value < mid3)
{
float temp = (value - mid2) / (mid3 - mid2);
color = Eigen::Vector3f(temp, 1.0, 0.0);
}

// yellow to red
else if (value >= mid3 && value <= max)
{
float temp = (value - mid3) / (max - mid3);
color = Eigen::Vector3f(1.0, 1.0 - temp, 0.0);
}

// handle color beyond red
else if (value > max)
{
color = Eigen::Vector3f(1.0, 0.0, 0.0);
}

// handle color beyond blue
else if (value < min)
{
color = Eigen::Vector3f(0.0, 0.0, 1.0);
}

return color;
}

Reference