use num::{traits::FloatConst, Float};
pub struct Lanczos2;
pub struct Lanczos3;
impl<T: Float + FloatConst> super::Sampler<T> for Lanczos2 {
#[inline]
fn kernel(x: T) -> T {
function(x, num!(2.0))
}
#[inline]
fn support() -> T {
num!(2.0)
}
}
impl<T: Float + FloatConst> super::Sampler<T> for Lanczos3 {
#[inline]
fn kernel(x: T) -> T {
function(x, num!(3.0))
}
#[inline]
fn support() -> T {
num!(3.0)
}
}
#[inline]
pub fn function<T: Float + FloatConst>(x: T, t: T) -> T {
if x.abs() < t {
sinc(x) * sinc(x / t)
}
else {
zero!()
}
}
#[inline]
pub fn sinc<T: Float + FloatConst>(t: T) -> T {
let a = t * T::PI();
if t == zero!() {
one!()
}
else {
a.sin() / a
}
}