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