use crate::math::{Point, Real, Vector};
use approx::AbsDiffEq;
use na::Unit;
pub trait Kernel: Send + Sync {
fn scalar_apply(r: Real, h: Real) -> Real;
fn scalar_apply_diff(r: Real, h: Real) -> Real;
fn apply(v: Vector<Real>, h: Real) -> Real {
Self::scalar_apply(v.norm(), h)
}
fn apply_diff(v: Vector<Real>, h: Real) -> Vector<Real> {
if let Some((dir, norm)) = Unit::try_new_and_get(v, Real::default_epsilon()) {
*dir * Self::scalar_apply_diff(norm, h)
} else {
Vector::zeros()
}
}
fn points_apply(p1: &Point<Real>, p2: &Point<Real>, h: Real) -> Real {
Self::apply(p1 - p2, h)
}
fn points_apply_diff1(p1: &Point<Real>, p2: &Point<Real>, h: Real) -> Vector<Real> {
Self::apply_diff(p1 - p2, h)
}
fn points_apply_diff2(p1: &Point<Real>, p2: &Point<Real>, h: Real) -> Vector<Real> {
-Self::apply_diff(p1 - p2, h)
}
}