# spectralColors.py V.1.0, Sep 19 2005. # SpectraLibrary # Copyright (C) 1998, Earl F. Glynn, Overland Park, KS. # May be copied freely for non-commercial use. # Translated from Delpi code from www.efg2.com/Lab def wavelength2RGB(wavelength): """wavelength2RGB(wavelength): given a wavelength in nanometers, return the approximate (r,g,b) values in [0,255] for the human vision on screen.""" # Adapted from www.isc.tamu.edu/~astro/color.html gamma = 0.80 intensityMax = 255 def adjust(color, factor): if color == 0.0: return 0 # Don't want 0^x = 1 for x != 0 else: result = intensityMax * ((color*factor) ** gamma) return int(round(result)) # Here a "caseof" can be really useful! int_wavelength = int(wavelength) if 380 <= int_wavelength <= 439: red = -(wavelength - 440) / (440 - 380) green = 0.0 blue = 1.0 elif 440 <= int_wavelength <= 489: red = 0.0 green = (wavelength - 440) / (490 - 440) blue = 1.0 elif 490 <= int_wavelength <= 509: red = 0.0 green = 1.0 blue = -(wavelength - 510) / (510 - 490) elif 510 <= int_wavelength <= 579: red = (wavelength - 510) / (580 - 510) green = 1.0 blue = 0.0 elif 580 <= int_wavelength <= 644: red = 1.0 green = -(wavelength - 645) / (645 - 580) blue = 0.0 elif 645 <= int_wavelength <= 780: red = 1.0 green = 0.0 blue = 0.0 else: red = 0.0 green = 0.0 blue = 0.0 # let the intensity fall off near the vision limits if 380 <= int_wavelength <= 419: factor = 0.3 + 0.7*(wavelength - 380) / (420 - 380) elif 420 <= int_wavelength <= 700: factor = 1.0 elif 701 <= int_wavelength <= 780: factor = 0.3 + 0.7*(780 - wavelength) / (780 - 700) else: factor = 0.0 return adjust(red, factor), adjust(green, factor), adjust(blue, factor) def rainbowColor(fraction, wavelengthMinimum=380, wavelengthMaximum=780): """rainbowColor(fraction, wavelengthMinimum=380, wavelengthMaximum=780): return spectrum colors for fraction between 0.0 to 1.0. Wavelengths are in Nanometers.""" wl = wavelengthMinimum + fraction*(wavelengthMaximum - wavelengthMinimum) wl = max(wavelengthMinimum, min(wl, wavelengthMaximum)) return wavelength2RGB(wl) if __name__ == '__main__': # Demo from Tkinter import * root = Tk() nx,ny = 500, 50 c = Canvas(root, width=nx, height=ny) c.pack() for x in xrange(nx): spectCol = "#%02x%02x%02x" % rainbowColor(float(x)/(nx-1)) c.create_line(x,0, x,ny, fill=spectCol) root.mainloop()