2#include <cgv/math/vec.h>
3#include <cgv/math/mat.h>
24inline mat<T> create_color_map(
unsigned steps=256,std::string name=
"jet")
32 vec<T> ls = lin_space<T>(0,1,steps);
35 for(
unsigned i = 0; i < steps;i++)
46 x=lin_space<T>(0,1,steps);
50 for(
unsigned i = 0; i < steps;i++)
53 map(0,i)=(7.0f/8.0f * x(i));
55 map(0,i)=(11.0f/8.0f * x(i) - 3.0f/8.0f);
58 map(1,i)=(7.0f/8.0f * x(i));
59 else if(x(i) < 3.0f/4.0f)
60 map(1,i)=(29.0f/24.0f * x(i) - 1.0f/8.0f);
62 map(1,i)=(7.0f/8.0f * x(i) + 1.0f/8.0f);
65 map(2,i)= (29.0f/24.0f * x(i));
67 map(2,i)=(7.0f/8.0f * x(i) + 1.0f/8.0f);
76 x=lin_space<T>(0,1,steps);
78 for(
unsigned i = 0; i < steps;i++)
80 map(0,i)=map(1,i)=map(2,i)=0.0f;
82 if((x(i) >= 3.0f/8.0f) && (x(i) < 5.0f/8.0f))
83 map(0,i) = (4.0f * x(i) - 3.0f/2.0f);
85 if((x(i) >= 5.0f/8.0f) && (x(i) < 7.0f/8.0f))
90 map(0,i)+= -4.0f * x(i) + 9.0f/2.0f;
93 if(x(i) >= 1.0f/8.0f && x(i) < 3.0f/8.0f)
94 map(1,i)= (4.0f * x(i) - 1.0f/2.0f);
96 if(x(i) >= 3.0f/8.0f && x(i) < 5.0f/8.0f)
100 if(x(i) >= 5.0f/8.0f && x(i) < 7.0f/8.0f)
101 map(1,i)+= (-4.0f * x(i) + 7.0f/2.0f);
105 map(2,i)= (4.0f * x(i) + 1.0f/2.0f);
107 if(x(i) >= 1.0f/8.0f && x(i) < 3.0f/8.0f)
111 if(x(i) >= 3.0f/8.0f && x(i) < 5.0f/8.0f)
112 map(2,i) += -4.0f * x(i) + 5.0f/2.0f;
123 x=lin_space<T>(0,1,steps);
125 for(
unsigned i = 0; i < steps;i++)
127 map(0,i)=map(1,i)=map(2,i)=0.0f;
129 if(x(i) <= 1.0f/3.0f)
130 map(0,i) = 3.0f*x(i);
135 if(x(i) > 1.0f/3.0f && x(i) < 2.0f/3.0f)
136 map(1,i)= 3.0f*x(i) -1.0f;
141 if(x(i) >= 2.0f/3.0f)
142 map(2,i)=3.0f*x(i)-2.0f;
151 x=lin_space<T>(0,1,steps);
153 for(
unsigned i = 0; i < steps;i++)
155 map(0,i)=map(1,i)=map(2,i)=0.0f;
157 if(x(i) <= 1.0f/5.0f)
159 if(x(i) > 1.0f/5.0f && x(i) <=2.0f/5.0f)
160 map(0,i) = -5.0f*x(i) + 2.0f;
162 map(0,i) = 5.0f*x(i)-4.0f;
164 if(x(i) <= 1.0f/5.0f)
165 map(1,i) = 5.0f*x(i);
166 if(x(i) > 1.0f/5.0f && x(i) <=3.0f/5.0f)
168 if(x(i) > 3.0f/5.0f && x(i) <= 4.0f/5.0f)
169 map(1,i) = -5.0f*x(i)+4.0f;
173 if(x(i) > 2.0f/5.0f && x(i) <=3.0f/5.0f)
174 map(2,i) = 5.0f*x(i)-2.0f;
175 if(x(i) > 3.0f/5.0f && x(i) <= 4.0f/5.0f)
178 map(2,i) = -5.0f*x(i)+5.0f;
188 x=lin_space<T>(0,1,steps);
190 for(
unsigned i = 0; i < steps;i++)
192 map(0,i)=map(1,i)=map(2,i)=0.0f;
195 if(x(i) <= 1.0f/7.0f)
196 map(0,i) = 7.0f*x(i);
197 if(x(i) > 1.0f/7.0f && x(i) <=2.0f/7.0f)
198 map(0,i) = -7.0f*x(i) + 2.0f;
199 if(x(i) > 4.0f/7.0f && x(i) <=5.0f/7.0f)
200 map(0,i) = 7.0f*x(i)-4.0f;
204 if(x(i) >=2.0f/7.0f && x(i) <= 3.0f/7.0f)
205 map(1,i) = 7.0f*x(i)-2.0f;
206 else if(x(i) > 3.0f/7.0f && x(i) <=5.0f/7.0f)
208 else if(x(i) > 5.0f/7.0f && x(i) <=6.0f/7.0f)
209 map(1,i) = -7.0f*x(i)+6.0f;
210 else if(x(i) > 6.0f/7.0f)
211 map(1,i) = 7.0f*x(i)-6.0f;
213 if(x(i) <= 1.0f/7.0f)
214 map(2,i) = 7.0f*x(i);
215 if(x(i) > 1.0f/7.0f && x(i) <=3.0f/7.0f)
217 if(x(i) > 3.0f/7.0f && x(i) <=4.0f/7.0f)
218 map(2,i) = -7.0f*x(i)+4.0f;
220 map(2,i) = 7.0f*x(i)-6.0f;
233 math::vec<T> rgb_2_cmy(
const math::vec<T>&
rgb)
241 template <
typename T>
242 void rgb_2_cmy(math::mat<T>& m)
244 for(
unsigned i = 0; i < m.ncols();i++)
245 m.set_col(i,rgb_2_cmy(m.col(i)));
249 template <
typename T>
250 math::vec<T> cmy_2_rgb(
const math::vec<T>& cmy)
258 template <
typename T>
259 void cmy_2_rgb(math::mat<T>& m)
261 for(
unsigned i = 0; i < m.ncols();i++)
262 m.set_col(i,cmy_2_rgb(m.col(i)));
268 template <
typename T>
269 math::vec<T> rgb_2_hsv(
const math::vec<T>&
rgb)
271 T _min, _max, _delta;
272 _min = minimum(
rgb(0),
rgb(1),
rgb(2) );
273 _max = maximum(
rgb(0),
rgb(1),
rgb(2) );
277 _delta = _max - _min;
279 hsv(1) = _delta / _max;
287 hsv(0) = (
rgb(1) -
rgb(2) ) / _delta;
288 else if(
rgb(1) == _max )
289 hsv(0) = 2 + (
rgb(2) -
rgb(0) ) / _delta;
291 hsv(0) = 4 + (
rgb(0) -
rgb(1) ) / _delta;
299 template <
typename T>
300 void rgb_2_hsv(math::mat<T>& m)
302 for(
unsigned i = 0; i < m.ncols();i++)
303 m.set_col(i,rgb_2_hsv(m.col(i)));
306 template <
typename T>
307 math::vec<T> hsv_2_rgb(
const math::vec<T>& hsv)
318 i = (int)floor( hsv(0) );
320 p = hsv(2) * ( (T)1 - hsv(1) );
321 q = hsv(2) * ( (T)1 - hsv(1) * f );
322 t = hsv(2) * ( (T)1 - hsv(1) * ( (T)1 - f ) );
358 template <
typename T>
359 void hsvb_2_rgb(math::mat<T>& m)
361 for(
unsigned i = 0; i < m.ncols();i++)
362 m.set_col(i,hsv_2_rgb(m.col(i)));
365 template <
typename T>
366 math::vec<T> rgb_2_yiq(
const math::vec<T>&
rgb)
369 yiq(0) = (T)0.299*
rgb(0) + (T)0.587*
rgb(1) + (T)0.114*
rgb(2);
370 yiq(1) = (T)0.596*
rgb(0) - (T)0.275*
rgb(1) - (T)0.321*
rgb(2);
371 yiq(2) = (T)0.212*
rgb(0) - (T)0.523*
rgb(1) + (T)0.311*
rgb(2);
375 template <
typename T>
376 T rgb_2_gray(
const math::vec<T>&
rgb)
378 return (T)0.299*
rgb(0) + (T)0.587*
rgb(1) + (T)0.114*
rgb(2);
381 template <
typename T>
382 void rgb_2_gray(
const math::mat<T>&
rgb, math::vec<T>& g)
384 g.resize(
rgb.ncols());
386 for(
unsigned i = 0; i < m.ncols();i++)
387 g(i)= (T)0.299*
rgb(0,i) + (T)0.587*
rgb(1,i) + (T)0.114*
rgb(2,i);
391 template <
typename T>
392 void rgb_2_gray(math::mat<T>&
rgb)
396 for(
unsigned i = 0; i <
rgb.ncols();i++)
398 rgb(0,i)= (T)0.299*
rgb(0,i) + (T)0.587*
rgb(1,i) + (T)0.114*
rgb(2,i);
404 template <
typename T>
405 void rgb_2_yiq(math::mat<T>& m)
407 for(
unsigned i = 0; i < m.ncols();i++)
408 m.set_col(i,rgb_2_yiq(m.col(i)));
411 template <
typename T>
412 math::vec<T> yiq_2_rgb(
const math::vec<T>& yiq)
415 rgb(0) = yiq(0) + (T)0.956*yiq(1) + (T)0.621*yiq(2);
416 rgb(1) = yiq(0) - (T)0.272*yiq(1) - (T)0.647*yiq(2);
417 rgb(2) = yiq(0) - (T)1.105*yiq(1) + (T)1.702*yiq(2);
421 template <
typename T>
422 void yiq_2_rgb(math::mat<T>& m)
424 for(
unsigned i = 0; i < m.ncols();i++)
425 m.set_col(i,yiq_2_rgb(m.col(i)));
428 template <
typename T>
429 math::vec<T> rgb_2_xyz(
const math::vec<T>&
rgb)
432 xyz(0) = (T)0.412453*
rgb(0) + (T)0.357580*
rgb(1) + (T)0.180423*
rgb(2);
433 xyz(1) = (T)0.212671*
rgb(0) + (T)0.715160*
rgb(1) + (T)0.072169*
rgb(2);
434 xyz(2) = (T)0.019334*
rgb(0) + (T)0.119193*
rgb(1) + (T)0.950227*
rgb(2);
439 template <
typename T>
440 void rgb_2_xyz(math::mat<T>& m)
442 for(
unsigned i = 0; i < m.ncols();i++)
443 m.set_col(i,rgb_2_xyz(m.col(i)));
447 template <
typename T>
448 math::vec<T> xyz_2_rgb(
const math::vec<T>& xyz)
451 rgb(0) = (T)3.240479*xyz(0) - (T)1.537150*xyz(1) - (T)0.498535*xyz(2);
452 rgb(1) = -(T)0.969256*xyz(0) + (T)1.875992*xyz(1) + (T)0.041556*xyz(2);
453 rgb(2) = (T)0.055648*xyz(0) - (T)0.204043*xyz(1) + (T)1.057311*xyz(2);
458 template <
typename T>
459 void xyz_2_rgb(math::mat<T>& m)
461 for(
unsigned i = 0; i < m.ncols();i++)
462 m.set_col(i,xyz_2_rgb(m.col(i)));
cgv::media::color< float, cgv::media::RGB > rgb
declare rgb color type with 32 bit components