Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!uunet!husc6!rutgers!sunybcs!bingvaxu!leah!itsgw!batcomputer!saponara From: saponara@batcomputer.tn.cornell.edu (John Saponara) Newsgroups: comp.graphics Subject: Re: Color conversion Message-ID: <2605@batcomputer.tn.cornell.edu> Date: Sat, 10-Oct-87 17:45:19 EDT Article-I.D.: batcompu.2605 Posted: Sat Oct 10 17:45:19 1987 Date-Received: Mon, 12-Oct-87 18:46:00 EDT References: <337@ndmath.UUCP> <328@ma.diab.UUCP> Reply-To: saponara@tcgould.tn.cornell.edu (John Saponara) Organization: Cornell Theory Center, Cornell University, Ithaca NY Lines: 129 Summary: HSV to RGB, plus new Graphics category on Netlib In article <337@ndmath.UUCP> milo@ndmath.UUCP (Greg Corson) writes: >Does anyone have a formulia for converting color from Red-Green-Blue to >hue-saturation-intensity and back again? Attached is a hunk of code from netlib, written by Eric Grosse. If you don't know about netlib, check "Communications of the ACM", May 1987, p.403-7. It's a public domain software distribution point, run for free (however, as they say, anything free comes with no guarantee). For more information (come to think of it, this is easier than checking out the article), write "send index" to either netlib@anl-mcs.arpa or research!netlib (the second one is more up to date, I think, due to the person running the arpa netlib being in Europe for the summer). Netlib is mostly numerical analysis stuff, but there are a few bits of interest to graphics people. My favorite library is "Polyhedra", which has some 142 polyhedra described by vertices, faces, edges, and more. Also, netlib's just started a graphics library: try "send index from graphics". I think the only contribution so far is my "Standard Procedural Database" package, which I posted to USENET just before SIGGRAPH '87. If you missed it back then, check out netlib now. While I'm on this topic, if anyone has tested their ray-tracer or hidden-surface hardware using this set of benchmark environments, I would like to know your results and, of as much interest, your opinions. The version on netlib is slightly more up-to-date. You may have already seen some of these databases, by the way: the AT&T Pixel Machine people were using three of them (recursive tetrahedron, recursive spheres, and fractal mountain) at their booth at SIGGRAPH '87 (at incredibly impressive times). Also, Jeff Goldsmith has tested these on a Caltech hypercube. I'd like to see more results for other algorithms and hardware. Final note: the images of the databases will be published in the November issue of "IEEE Computer Graphics & Applications." Post-final note: netlib is looking for public domain graphics algorithms (of fairly reasonable quality): for those of you who've been around awhile and collected some good graphics comp.sources, please tell Eric Grosse of netlib about them. (I'd also be interested - I just got this USENET account two days ago so am pretty out of touch with what has been going on in this group). All for now, Eric Haines, 3D/Eye Inc, 410 E. Upland Rd, Ithaca, NY 14850 work: (607)-257-1381 [better to write me at hpfcla!hpfcrs!eye!erich@hplabs.HP.COM - the account I used to post this msg is a housemate's] -----------------hsv to rgb C code follows-------------------------- /* rainbow(h, s, v, r, g, b) double h, s, v, *r, *g, *b; This routine computes colors suitable for use in color level plots. Typically s=v=1 and h varies from 0 (red) to 1 (blue) in equally spaced steps. (h=.5 gives green; 1 #include double huettab[] = { 0.0000, 0.0062, 0.0130, 0.0202, 0.0280, 0.0365, 0.0457, 0.0559, 0.0671, 0.0796, 0.0936, 0.1095, 0.1275, 0.1482, 0.1806, 0.2113, 0.2393, 0.2652, 0.2892, 0.3119, 0.3333, 0.3556, 0.3815, 0.4129, 0.4526, 0.5060, 0.5296, 0.5501, 0.5679, 0.5834, 0.5970, 0.6088, 0.6191, 0.6281, 0.6361, 0.6430, 0.6490, 0.6544, 0.6590, 0.6631, 0.6667, 0.6713, 0.6763, 0.6815, 0.6873, 0.6937, 0.7009, 0.7092, 0.7190, 0.7308, 0.7452, 0.7631, 0.7856, 0.8142, 0.8621, 0.9029, 0.9344, 0.9580, 0.9755, 0.9889, 1.0000 }; #define NUM_INTERVALS 7 main(argc,argv) int argc; char *argv[]; { int i ; double h,s,v,r,g,b; s = v = 1 ; for ( i = 0 ; i < NUM_INTERVALS ; ++i ) { h = (double) i / (double) ( NUM_INTERVALS - 1 ) ; rainbow( h, s, v, &r, &g, &b ) ; printf( "%3d: %g %g %g\n", i, r,g,b ) ; } } /* computed from the FMC-1 color difference formula */ /* Barco monitor, max(r,g,b)=1, n=61 magenta, 2 Jan 1986 */ rainbow(h, s, v, r, g, b) double h, s, v, *r, *g, *b; { int i; double modf(), trash; h = 60*modf(h/1.5,&trash); i = floor(h); h = huettab[i] + (huettab[i+1]-huettab[i])*(h-i); dhsv2rgb(h,s,v,r,g,b); } dhsv2rgb(h, s, v, r, g, b) /*...hexcone model...*/ double h, s, v, *r, *g, *b; /* all variables in range [0,1[ */ /* here, h=.667 gives blue, h=0 or 1 gives red. */ { /* see Alvy Ray Smith, Color Gamut Transform Pairs, SIGGRAPH '78 */ int i; double f, m, n, k; double modf(), trash; h = 6*modf(h,&trash); i = floor(h); f = h-i; m = (1-s); n = (1-s*f); k = (1-(s*(1-f))); switch(i){ case 0: *r=1; *g=k; *b=m; break; case 1: *r=n; *g=1; *b=m; break; case 2: *r=m; *g=1; *b=k; break; case 3: *r=m; *g=n; *b=1; break; case 4: *r=k; *g=m; *b=1; break; case 5: *r=1; *g=m; *b=n; break; default: fprintf(stderr,"bad i: %f %d",h,i); exit(1); } f = *r; if( f < *g ) f = *g; if( f < *b ) f = *b; f = v / f; *r *= f; *g *= f; *b *= f; }