Skip to content

Instantly share code, notes, and snippets.

@9prady9
Last active November 17, 2016 17:06
Show Gist options
  • Save 9prady9/59e9678f8ffdb1702b52284e078c301e to your computer and use it in GitHub Desktop.
Save 9prady9/59e9678f8ffdb1702b52284e078c301e to your computer and use it in GitHub Desktop.
Rust snippet to generate visible spectrum colours based on wavelength
static GAMMA: f64 = 0.80;
static INTENSITY_MAX: f64 = 255.0;
static MAX_WVL: f64 = 780.0;
static MIN_WVL: f64 = 380.0;
/** Taken from Earl F. Glynn's web page:
* <a href="http://www.efg2.com/Lab/ScienceAndEngineering/Spectra.htm">Spectra Lab Report</a>
* */
pub fn wavelength_to_rgb(wavelength: f64) -> (u32, u32, u32) {
let factor: f64;
let red: f64;
let green: f64;
let blue: f64;
if (wavelength >= 380.0) && (wavelength<440.0) {
red = -(wavelength - 440.0) / (440.0 - 380.0);
green = 0.0;
blue = 1.0;
} else if (wavelength >= 440.0) && (wavelength<490.0) {
red = 0.0;
green = (wavelength - 440.0) / (490.0 - 440.0);
blue = 1.0;
} else if (wavelength >= 490.0) && (wavelength<510.0) {
red = 0.0;
green = 1.0;
blue = -(wavelength - 510.0) / (510.0 - 490.0);
} else if (wavelength >= 510.0) && (wavelength<580.0) {
red = (wavelength - 510.0) / (580.0 - 510.0);
green = 1.0;
blue = 0.0;
} else if (wavelength >= 580.0) && (wavelength<645.0) {
red = 1.0;
green = -(wavelength - 645.0) / (645.0 - 580.0);
blue = 0.0;
} else if (wavelength >= 645.0) && (wavelength<781.0) {
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 (wavelength >= 380.0) && (wavelength<420.0) {
factor = 0.3 + 0.7*(wavelength - 380.0) / (420.0 - 380.0);
} else if (wavelength >= 420.0) && (wavelength<701.0) {
factor = 1.0;
} else if (wavelength >= 701.0) && (wavelength<781.0) {
factor = 0.3 + 0.7*(780.0 - wavelength) / (780.0 - 700.0);
} else {
factor = 0.0;
};
// Don't want 0^x = 1 for x <> 0
let r = if red==0.0 {0} else {(INTENSITY_MAX * (red * factor).powf(GAMMA)).round() as u32};
let g = if green==0.0 {0} else {(INTENSITY_MAX * (green * factor).powf(GAMMA)).round() as u32};
let b = if blue==0.0 {0} else {(INTENSITY_MAX * (blue * factor).powf(GAMMA)).round() as u32};
(r, g, b)
}
fn main() {
let mut wvl = MIN_WVL;
while wvl<MAX_WVL {
let (r, g, b) = wavelength_to_rgb(wvl);
println!("{:.7e}, {:.7e}, {:.7e}, 1.0,", r as f32/255.0, g as f32/255.0, b as f32/255.0);
wvl += 1.0;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment