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
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
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
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
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
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
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
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
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
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
00180 inline void height_map(RGB* c, float val, float min, float max) {
00181
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
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