1 #include "Color_ramp.h"
2 #include <iostream>
3
4 // -----------------------------------
5 // Color_component
6 // -----------------------------------
7 Color_component::
Color_component()8 Color_component()
9 {
10 add(0,0);
11 add(1,1);
12 }
13
14 Color_component::
Color_component(const double c0,const double c1)15 Color_component(const double c0, const double c1)
16 {
17 add(0,c0);
18 add(1,c1);
19 }
20
21 double
22 Color_component::
interpolate(const double v) const23 interpolate(const double v) const
24 {
25 Values::const_iterator next = next_it(v);
26
27 // next is just after v
28 Values::const_iterator prev = --next;
29 ++next;
30
31 if ( v>=1 && next != values_.end())
32 std::cerr << ".";
33
34 if ( next == values_.end() )
35 {
36 return prev->second;
37 }
38
39 const double& a = prev->first;
40 const double& b = next->first;
41 return (b-v)/(b-a) * prev->second + (v-a)/(b-a) * next->second;
42
43 }
44
45 void
46 Color_component::
add(const double v,double color)47 add(const double v, double color)
48 {
49 if ( color > 1 ) { color = 1; }
50 if ( color < 0 ) { color = 0; }
51
52 Values::iterator next = next_it(v);
53 values_.insert(next, std::make_pair(v,color));
54 }
55
56
57 void
58 Color_component::
rebuild(const double c0,const double c1)59 rebuild(const double c0, const double c1)
60 {
61 values_.clear();
62 add(1,c1);
63 add(0,c0);
64 }
65
66 void
67 Color_component::
print() const68 print() const
69 {
70 for ( Values::const_iterator it = values_.begin(),
71 end = values_.end() ; it != end ; ++it )
72 {
73 std::cout << "<" << it->first << "," << it->second << "> ";
74 }
75
76 std::cout << std::endl;
77 }
78
79
80 // -----------------------------------
81 // Color_ramp
82 // -----------------------------------
Color_ramp()83 Color_ramp::Color_ramp()
84 : r_()
85 , g_()
86 , b_()
87 {
88 }
89
Color_ramp(const double r0,const double r1,const double g0,const double g1,const double b0,const double b1)90 Color_ramp::Color_ramp(const double r0, const double r1,
91 const double g0, const double g1,
92 const double b0, const double b1)
93 {
94 r_.rebuild(r0,r1);
95 g_.rebuild(g0,g1);
96 b_.rebuild(b0,b1);
97
98 r_.add(0.5,(std::max)(r0,r1));
99 g_.add(0.5,(std::max)(g0,g1));
100 b_.add(0.5,(std::max)(b0,b1));
101 }
102
103 void
build_red()104 Color_ramp::build_red()
105 {
106 r_.rebuild(1,0.5);
107 g_.rebuild(1,0);
108 b_.rebuild(1,0);
109
110 r_.add(0.3,1);
111 r_.add(0.05,1);
112 g_.add(0.05,0.95);
113 g_.add(0.3,0.5);
114 b_.add(0.05,0);
115 }
116
117 void
build_blue()118 Color_ramp::build_blue()
119 {
120 r_.rebuild(1,0);
121 g_.rebuild(1,0);
122 b_.rebuild(1,0.5);
123
124 b_.add(0.1,0.8);
125 g_.add(0.1,0.4);
126 r_.add(0.1,0.4);
127 }
128
129 void
build_thermal()130 Color_ramp::build_thermal()
131 {
132 r_.rebuild(1,0.5);
133 g_.rebuild(1,0);
134 b_.rebuild(1,0);
135
136 r_.add(0.0,0);
137 r_.add(1,1);
138 g_.add(0.05,0.8);
139 g_.add(0.3,0.5);
140 b_.add(0.0,1.0);
141 b_.add(1.0,0.0);
142 }
143
144 void
build_rainbow()145 Color_ramp::build_rainbow()
146 {
147 r_.rebuild(1,0.5);
148 g_.rebuild(1,0);
149 b_.rebuild(1,0);
150
151 r_.add(0,0.75);
152 g_.add(0,0.75);
153 b_.add(0,1);
154
155 r_.add(0.2,0);
156 g_.add(0.2,0);
157 b_.add(0.2,1);
158
159 r_.add(0.4,0);
160 g_.add(0.4,1);
161 b_.add(0.4,0);
162
163 r_.add(0.6,1);
164 g_.add(0.6,1);
165 b_.add(0.6,0);
166
167 r_.add(0.8,1);
168 g_.add(0.8,0);
169 b_.add(0.8,0);
170 }
171
172 void
173 Color_ramp::
print() const174 print() const
175 {
176 std::cout << "r: ";
177 r_.print();
178 std::cout << "g: ";
179 g_.print();
180 std::cout << "b: ";
181 b_.print();
182 }
183
184