static void angle_to_colour(double result[3],
double angle /* in units of 2pi radians< <1.0 */,
int reverse) {
- /* Inspired by http://www.acm.org/jgt/papers/SmithLyons96/hsv_rgb.html */
- int i;
- double f;
+ int s;
+ double f, u, d, U, D;
angle *= 6.0;
- i= floor(angle);
- f= angle - i;
+ s= floor(angle);
+ f= angle - s;
+ if (reverse) { s += 3; s %= 6; }
- if (reverse) { i += 3; i %= 6; }
- if (i&1) f= 1.0 - f;
+ u= f * 0.5;
+ U= u + 0.5;
+ d= 0.5 - u;
+ D= d + 0.5;
- switch (i) {
+ switch (s) {
#define R(r,g,b) if(1){ result[0]=r; result[1]=g; result[2]=b; break; }else
- case 0: R( 1, f, 0 );
- case 1: R( f, 1, 0 );
- case 2: R( 0, 1, f );
- case 3: R( 0, f, 1 );
- case 4: R( f, 0, 1 );
- case 5: R( 1, 0, f );
+ case 0: R( D, U, 0 );
+ case 1: R( d, 1, u );
+ case 2: R( 0, D, U );
+ case 3: R( u, d, 1 );
+ case 4: R( U, 0, D );
+ case 5: R( 1, u, d );
#undef R
}
}