* Last processed by NICE on 12-Jun-2000 15:54:00 * Customized for : IEEE, LINUX, UNIX, MOTIF, F77 SUBROUTINE RGB_TO_HSV(H,S,V,R,G,B) C---------------------------------------------------------------------- C DISPLAY Internal routine C Convert Red-Green-Blue to Hue-Saturation-Value color C representation. C Arguments C H R*4 Hue [0,360] Output C S R*4 Saturation [0,1] Output C V R*4 Value [0,1] Output C R R*4 Red [0,1] Input C G R*4 Green [0,1] Input C B R*4 Blue [0,1] Input C Device independent module C---------------------------------------------------------------------- REAL H,S,V,R,G,B,C_MAX,C_MIN,R_REL,G_REL,B_REL * C_MAX = MAX(R,MAX(B,G)) C_MIN = MIN(R,MIN(B,G)) * IF (C_MAX.EQ.C_MIN) THEN * * hue is undefined along the axis of equal r,g,b * Use Saturation=0 and any colour (Hue 0) as a value to get the right * grey rather than white (V = 1.0) H = 0. S = 0.0 V = R ELSE V = C_MAX S = (C_MAX-C_MIN)/C_MAX R_REL = (C_MAX-R)/(C_MAX-C_MIN) G_REL = (C_MAX-G)/(C_MAX-C_MIN) B_REL = (C_MAX-B)/(C_MAX-C_MIN) IF (R.EQ.C_MAX) THEN IF (G.EQ.C_MIN) THEN H = 5.0 + B_REL ELSE H = 1.0 - G_REL ENDIF ELSEIF (G.EQ.C_MAX) THEN IF (B.EQ.C_MIN) THEN H = 1.0 + R_REL ELSE H = 3.0 - B_REL ENDIF ELSE IF (R.EQ.C_MIN) THEN H = 3.0 + G_REL ELSE H = 5.0 - R_REL ENDIF ENDIF * * now convert hue to degrees H = H*60. ENDIF END