colors.h

00001 #ifndef __COLORS_H__
00002 #define __COLORS_H__
00003 
00004 #include <math.h>
00005 
00006 typedef struct RGB {
00007   unsigned char r,g,b;
00008 } RGB;
00009 
00010 inline void set_rgb(RGB* c, unsigned char r, unsigned char g, unsigned char b) {
00011   c->r = r; c->g = g; c->b = b;
00012 }
00013 
00014 inline void map_color_rainbow(RGB* c, float val, float min, float max) {
00015   // blue low, red hight, linear in between
00016   float lval = val;
00017   if (val>max) lval = max;
00018   if (val<min) lval = min;
00019 
00020   float t4=((lval-min)/(max-min))*4.;
00021   int i = (int)t4;
00022   float v = t4-(float)i;
00023   switch (i) {
00024     case 0:
00025       set_rgb(c,0,(unsigned int)(255.*v),255);
00026       break;
00027     case 1:
00028       set_rgb(c,0,255,(unsigned int)(255.*(1.-v)));
00029       break;
00030     case 2:
00031       set_rgb(c,(unsigned int)(255.*v),255,0);
00032       break;
00033     case 3:
00034       set_rgb(c,255,(unsigned int)(255.*(1.-v)),0);
00035       break;
00036     case 4:
00037       set_rgb(c,255,0,0);
00038       break;
00039   }
00040 }
00041 
00042 inline void map_color_rainbow_cycle(RGB* c, float val, float min, float max) {
00043   // blue low, red hight, linear in between
00044   float lval = val;
00045   if (val>max) lval = max;
00046   if (val<min) lval = min;
00047 
00048   float t6=((lval-min)/(max-min))*6.;
00049   int i = (int)t6;
00050   float v = t6-(float)i;
00051   switch (i) {
00052     case 0:
00053       set_rgb(c,0,(unsigned int)(255.*v),255);
00054       break;
00055     case 1:
00056       set_rgb(c,0,255,(unsigned int)(255.*(1.-v)));
00057       break;
00058     case 2:
00059       set_rgb(c,(unsigned int)(255.*v),255,0);
00060       break;
00061     case 3:
00062       set_rgb(c,255,(unsigned int)(255.*(1.-v)),0);
00063       break;
00064     case 4:
00065       set_rgb(c,255,0,(unsigned int)(255.*(v)));
00066       break;
00067     case 5:
00068       set_rgb(c,(unsigned int)(255.*(1.-v)),0,255);
00069       break;
00070     case 6:
00071       set_rgb(c,0,0,255);
00072       break;
00073   }
00074 }
00075 
00076 
00077 inline void map_color_fine(RGB* c, float val, float min, float max) {
00078   // blue low, red hight, linear in between
00079   float lval = val;
00080   if (val>max) lval = max;
00081   if (val<min) lval = min;
00082 
00083   float t = (lval-min)/(max-min);
00084   int i = (int)(t*20.);
00085   float v = t*20.0-(float)i;
00086 
00087   set_rgb(c,(unsigned char)(255.*t),
00088             (unsigned char)(255.*v),
00089             (unsigned char)(255.*(1.-v)*(1.-t)));
00090 }
00091 
00092 inline void map_color_sine(RGB* c, float val, float min, float max) {
00093   // blue low, red hight, linear in between
00094   float t = (val-min)/(max-min);
00095 
00096   set_rgb(c,(unsigned char)(255.*t),
00097             (unsigned char)(255.*(.5*sin(2*M_PI*20.*t-M_PI)+.5)),
00098             (unsigned char)(255.*(.5*sin(2*M_PI*20.*t)+.5)*(1.-t)));
00099 }
00100 
00101 inline float b2f(unsigned char c) {
00102   int i,v=0;
00103   for (i=0;i<8;i++) v += (1<<i&c);
00104   return (float)v;
00105 }
00106 
00107 inline void map_color_sine_end(RGB* c, float val, float min, float max) {
00108   // blue low, red hight, linear in between
00109   float lval = val;
00110   if (val>max) lval = max;
00111   if (val<min) lval = min;
00112   float t = (lval-min)/(max-min),t2;
00113   RGB c2;float r,g,b,r2,g2,b2;
00114   unsigned int ri,gi,bi;
00115 
00116   const float eps = 1./100.;
00117   const float eps2 = (eps-1.)/eps;
00118 
00119   map_color_sine(c,t,0,1);
00120   if (t>1-eps) {
00121     // Map t to [0,1]
00122     t2 = 1./eps*t + eps2;
00123     map_color_rainbow(&c2,t2,0,1);
00124     r=b2f(c->r);g=b2f(c->g);b=b2f(c->b);
00125     r2=b2f(c2.r);g2=b2f(c2.g);b2=b2f(c2.b);
00126 
00127     // fade color in with sharp ramp
00128     const float fadein = .1;
00129     if (t2<fadein) {
00130       t2 /= fadein;
00131       ri = (unsigned int)rintf(r*(1.-t2) + t2*r2);
00132       gi = (unsigned int)rintf(g*(1.-t2) + t2*g2);
00133       bi = (unsigned int)rintf(b*(1.-t2) + t2*b2);
00134     }
00135     else {
00136       ri = (unsigned int)rintf(r2);
00137       gi = (unsigned int)rintf(g2);
00138       bi = (unsigned int)rintf(b2);
00139     }
00140     set_rgb(c,(unsigned char)ri,
00141               (unsigned char)gi,
00142               (unsigned char)bi);
00143 
00144   }
00145 }
00146 
00147 inline void map_color_rainbow_fast(RGB* c, float val, float min, float max) {
00148   // blue low, red hight, linear in between
00149   float lval = val;
00150   if (val>max) lval = max;
00151   if (val<min) lval = min;
00152   float t = (lval-min)/(max-min);
00153 
00154   const float num_reps = 10;
00155 
00156   while (t>1./num_reps) {
00157     t -= 1./num_reps;
00158   }
00159   t *= num_reps;
00160   map_color_rainbow_cycle(c, t, 0, 1);
00161 }
00162 
00163 inline void map_color_sine_acc(RGB* c, float val, float min, float max) {
00164   // blue low, red hight, linear in between
00165   float lval = val;
00166   if (val>max) lval = max;
00167   if (val<min) lval = min;
00168   float t = (lval-min)/(max-min);
00169 
00170   const float num_reps = 80;
00171 
00172   set_rgb(c,(unsigned char)(255.*(sin(num_reps*M_PI*t*t+M_PI)*.5+.5)),
00173             (unsigned char)(255.*(sin(num_reps*2*M_PI*t*t*t)*.5+.5)),
00174             (unsigned char)(255.*t*t));
00175 }
00176 
00177 
00178 
00179 // Black and white scale from 0 (black) to 1 (white)
00180 inline void height_map(RGB* c, float val, float min, float max) {
00181   // blue low, red hight, linear in between
00182   float lval = val;
00183   if (val>max) lval = max;
00184   if (val<min) lval = min;
00185   float t = (lval-min)/(max-min);
00186 
00187   unsigned int ri,gi,bi;
00188 
00189   ri = (unsigned int)rintf(t*255.);
00190   gi = (unsigned int)rintf(t*255.);
00191   bi = (unsigned int)rintf(t*255.);
00192 
00193   set_rgb(c,(unsigned char)ri,
00194             (unsigned char)gi,
00195             (unsigned char)bi);
00196 }
00197 
00198 inline void map_bw(RGB* c, float val, float min, float max) {
00199   // blue low, red hight, linear in between
00200 
00201   float lval = val;
00202   if (val>max) lval = max;
00203   if (val<min) lval = min;
00204   float t = (lval-min)/(max-min), s;
00205 
00206   s = cos(2*M_PI*10.*t);
00207         if (s>.8)
00208     set_rgb(c,0,0,0);
00209         else
00210                 set_rgb(c,255,255,255);
00211 }
00212 
00213 
00214 
00215 #endif

Generated on Mon Feb 8 17:22:35 2010 for libbiarc by  doxygen 1.5.6