pub fn fade_in(x: f64) -> f64 {
if x < 0.0 {
0.0
} else if x >= 0.0 && x <= 1.0 {
x
} else if x > 1.0 {
1.0
} else {
f64::NAN
}
}
pub fn fade_out(x: f64) -> f64 {
if x < 0.0 {
1.0
} else if x >= 0.0 && x <= 1.0 {
1.0 - x
} else if x > 1.0 {
0.0
} else {
f64::NAN
}
}
pub fn square_wave(x: f64) -> f64 {
let f = x - x.floor();
if f < 0.5 {
1.0
} else if f > 0.5 {
-1.0
} else if f == 0.0 || f == 0.5 {
0.5
} else {
f64::NAN
}
}
pub fn triangle_wave(x: f64) -> f64 {
let f = x - x.floor();
if f < 0.25 {
f * 4.0
} else if f >= 0.25 && f < 0.75 {
1.0 - (f - 0.25) * 4.0
} else if f >= 0.75 && f <= 1.0 {
-1.0 + (f - 0.75) * 4.0
} else {
f64::NAN
}
}
pub fn sawtooth_wave(x: f64) -> f64 {
let f = x - x.floor();
if f < 0.5 {
f * 2.0
} else if f > 0.5 && f <= 1.0 {
-1.0 + (f - 0.5) * 2.0
} else if f == 0.5 {
0.0
} else {
f64::NAN
}
}
pub fn sine_wave(x: f64) -> f64 {
(2.0 * std::f64::consts::PI * x).sin()
}
pub fn pulse(x: f64, alpha: f64) -> f64 {
let f = x - x.floor();
if f < alpha {
1.0
} else if f > alpha {
0.0
} else if f == 0.0 || f == alpha {
if alpha <= 0.0 {
0.0
} else if alpha >= 1.0 {
1.0
} else {
0.5
}
} else {
f64::NAN
}
}
pub fn boxcar(x: f64) -> f64 {
heaviside_step(x) - heaviside_step(x - 1.0)
}
pub fn heaviside_step(x: f64) -> f64 {
if x < 0.0 {
0.0
} else if x > 0.0 {
1.0
} else if x == 0.0 {
0.5
} else {
f64::NAN
}
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn test_fade_in() {
assert_eq!(0.0, fade_in(-100.0));
assert_eq!(0.0, fade_in(-0.9));
assert_eq!(0.0, fade_in(-0.1));
assert_eq!(0.0, fade_in(0.0));
assert_eq!(0.25, fade_in(0.25));
assert_eq!(0.5, fade_in(0.5));
assert_eq!(0.75, fade_in(0.75));
assert_eq!(1.0, fade_in(1.0));
assert_eq!(1.0, fade_in(1.1));
assert_eq!(1.0, fade_in(1.9));
assert_eq!(1.0, fade_in(100.0));
assert!(0.0 != fade_in(f64::NAN));
assert!(0.5 != fade_in(f64::NAN));
assert!(1.0 != fade_in(f64::NAN));
}
#[test]
fn test_fade_out() {
assert_eq!(1.0, fade_out(-100.0));
assert_eq!(1.0, fade_out(-0.9));
assert_eq!(1.0, fade_out(-0.1));
assert_eq!(1.0, fade_out(0.0));
assert_eq!(0.75, fade_out(0.25));
assert_eq!(0.5, fade_out(0.5));
assert_eq!(0.25, fade_out(0.75));
assert_eq!(0.0, fade_out(1.0));
assert_eq!(0.0, fade_out(1.1));
assert_eq!(0.0, fade_out(1.9));
assert_eq!(0.0, fade_out(100.0));
assert!(0.0 != fade_out(f64::NAN));
assert!(0.5 != fade_out(f64::NAN));
assert!(1.0 != fade_out(f64::NAN));
}
#[test]
fn test_heaviside_step() {
assert_eq!(0.0, heaviside_step(-100.0));
assert_eq!(0.0, heaviside_step(-0.9));
assert_eq!(0.0, heaviside_step(-0.1));
assert_eq!(0.5, heaviside_step(0.0));
assert_eq!(1.0, heaviside_step(0.1));
assert_eq!(1.0, heaviside_step(0.5));
assert_eq!(1.0, heaviside_step(0.9));
assert_eq!(1.0, heaviside_step(1.1));
assert_eq!(1.0, heaviside_step(1.9));
assert_eq!(1.0, heaviside_step(100.0));
assert!(0.0 != heaviside_step(f64::NAN));
assert!(0.5 != heaviside_step(f64::NAN));
assert!(1.0 != heaviside_step(f64::NAN));
}
}