#[derive(Debug, Clone)]
pub struct Spectrum {
pub start_nm: f32,
pub stop_nm: f32,
pub spacing_nm: f32,
pub data: Vec<f32>,
}
impl Spectrum {
pub fn new(start_nm: f32, stop_nm: f32, spacing_nm: f32, data: Vec<f32>) -> Self {
Self {
start_nm,
stop_nm,
spacing_nm,
data,
}
}
pub fn num_samples(&self) -> usize {
((self.stop_nm - self.start_nm) / self.spacing_nm).round() as usize + 1
}
pub fn wavelength_at(&self, index: usize) -> f32 {
self.start_nm + (index as f32 * self.spacing_nm)
}
pub fn contains_wavelength(&self, wavelength_nm: f32) -> bool {
wavelength_nm >= self.start_nm && wavelength_nm <= self.stop_nm
}
}
#[derive(Debug, Clone, Copy)]
pub struct ConstSpectrum {
pub start_nm: f32,
pub stop_nm: f32,
pub spacing_nm: f32,
pub num_channels: usize,
pub data: &'static [f32],
}
impl ConstSpectrum {
pub const fn num_samples(&self) -> usize {
((self.stop_nm - self.start_nm) / self.spacing_nm) as usize + 1
}
pub const fn wavelength_at(&self, index: usize) -> f32 {
self.start_nm + (index as f32 * self.spacing_nm)
}
pub const fn contains_wavelength(&self, wavelength_nm: f32) -> bool {
wavelength_nm >= self.start_nm && wavelength_nm <= self.stop_nm
}
}
impl From<&ConstSpectrum> for Spectrum {
fn from(const_spectrum: &ConstSpectrum) -> Self {
Self {
start_nm: const_spectrum.start_nm,
stop_nm: const_spectrum.stop_nm,
spacing_nm: const_spectrum.spacing_nm,
data: const_spectrum.data.to_vec(),
}
}
}
#[derive(Debug, Clone)]
pub struct Spectrum3 {
pub start_nm: f32,
pub stop_nm: f32,
pub spacing_nm: f32,
pub data: Vec<f32>,
}
impl Spectrum3 {
pub fn new(start_nm: f32, stop_nm: f32, spacing_nm: f32, data: Vec<f32>) -> Self {
Self {
start_nm,
stop_nm,
spacing_nm,
data,
}
}
pub fn num_samples(&self) -> usize {
self.data.len() / 3
}
pub fn wavelength_at(&self, index: usize) -> f32 {
self.start_nm + (index as f32 * self.spacing_nm)
}
pub fn get_at(&self, index: usize) -> Option<[f32; 3]> {
if index * 3 + 2 < self.data.len() {
Some([
self.data[index * 3],
self.data[index * 3 + 1],
self.data[index * 3 + 2],
])
} else {
None
}
}
pub fn contains_wavelength(&self, wavelength_nm: f32) -> bool {
wavelength_nm >= self.start_nm && wavelength_nm <= self.stop_nm
}
}