#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ComplexMode {
Absolute,
Phase,
Real,
Imaginary,
SquareAmplitude,
Log10Amplitude,
AmplitudePhase,
Log10AmplitudePhase,
}
impl ComplexMode {
pub const ALL: [ComplexMode; 8] = [
ComplexMode::Absolute,
ComplexMode::SquareAmplitude,
ComplexMode::Phase,
ComplexMode::Real,
ComplexMode::Imaginary,
ComplexMode::Log10Amplitude,
ComplexMode::AmplitudePhase,
ComplexMode::Log10AmplitudePhase,
];
pub fn label(self) -> &'static str {
match self {
ComplexMode::Absolute => "Amplitude",
ComplexMode::SquareAmplitude => "Square amplitude",
ComplexMode::Phase => "Phase",
ComplexMode::Real => "Real part",
ComplexMode::Imaginary => "Imaginary part",
ComplexMode::Log10Amplitude => "Log10(amplitude)",
ComplexMode::AmplitudePhase => "Amplitude and Phase",
ComplexMode::Log10AmplitudePhase => "Log10 Amplitude and Phase",
}
}
pub fn is_rgba(self) -> bool {
matches!(
self,
ComplexMode::AmplitudePhase | ComplexMode::Log10AmplitudePhase
)
}
pub fn to_scalar(self, re: f32, im: f32) -> f32 {
match self {
ComplexMode::Absolute => re.hypot(im),
ComplexMode::Phase => im.atan2(re),
ComplexMode::Real => re,
ComplexMode::Imaginary => im,
ComplexMode::SquareAmplitude => re * re + im * im,
ComplexMode::Log10Amplitude => re.hypot(im).log10(),
ComplexMode::AmplitudePhase | ComplexMode::Log10AmplitudePhase => 0.0,
}
}
}