1 typedef unsigned char UC;
2
3 struct RGB
4 {
5 RGB() : r(0), g(0), b(0) {}
6 RGB(UC _r, UC _g, UC _b) : r(_r), g(_g), b(_b) {}
7 UC r,g,b;
8 };
9
10 RGB toRGB(const std::complex<double>& d)
11 {
12 const double H = (3*arg(-d)/M_PI)+3;
13 const double Q = H - trunc(H);
14 double R,G,B;
15 switch( unsigned(H) )
16 {
17 case 0: R=1 ; G=H ; B=0 ; break;
18 case 1: R=1-Q; G=1 ; B=0 ; break;
19 case 2: R=0 ; G=1 ; B=Q ; break;
20 case 3: R=0 ; G=1-Q; B=1 ; break;
21 case 4: R=Q ; G=0 ; B=1 ; break;
22 case 5: R=1 ; G=0 ; B=1-Q; break;
23 case 6: R=1 ; G=H ; B=0 ; break; // should never happen?
24 default : R=G=B=0.5;
25 }
26 const double a = abs(d);
27 if(a<=1.0)
28 {
29 const double aa=a*256;
30 return RGB( UC(R*aa), UC(G*aa), UC(B*aa) );
31 }else{
32 const double aa = 256/sqrt(a);
33 const double W = 255-aa;
34 return RGB( UC(R*aa)+W, UC(G*aa)+W, UC(B*aa)+W );
35 }
36 }
syntax highlighted by Code2HTML, v. 0.9.1