chiark / gitweb /
angle colour has constant luminance
authorian <ian>
Sat, 23 Oct 2004 10:50:49 +0000 (10:50 +0000)
committerian <ian>
Sat, 23 Oct 2004 10:50:49 +0000 (10:50 +0000)
layout/subseg2display.c

index 23538ea7e500dc60cc1fb00e1d56ee9486d03dab..7d89cdc78c0d829f6db61d93d8426fabc3fd952d 100644 (file)
@@ -196,25 +196,27 @@ static unsigned reverse_bits_in_byte(unsigned a) {
 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
   }
 }