1use crate::math::{Point, Real, Vector};
2use approx::AbsDiffEq;
3use na::Unit;
4
5pub trait Kernel: Send + Sync {
7 fn scalar_apply(r: Real, h: Real) -> Real;
9 fn scalar_apply_diff(r: Real, h: Real) -> Real;
11
12 fn apply(v: Vector<Real>, h: Real) -> Real {
14 Self::scalar_apply(v.norm(), h)
15 }
16
17 fn apply_diff(v: Vector<Real>, h: Real) -> Vector<Real> {
19 if let Some((dir, norm)) = Unit::try_new_and_get(v, Real::default_epsilon()) {
20 *dir * Self::scalar_apply_diff(norm, h)
21 } else {
22 Vector::zeros()
23 }
24 }
25
26 fn points_apply(p1: &Point<Real>, p2: &Point<Real>, h: Real) -> Real {
28 Self::apply(p1 - p2, h)
29 }
30
31 fn points_apply_diff1(p1: &Point<Real>, p2: &Point<Real>, h: Real) -> Vector<Real> {
33 Self::apply_diff(p1 - p2, h)
34 }
35
36 fn points_apply_diff2(p1: &Point<Real>, p2: &Point<Real>, h: Real) -> Vector<Real> {
38 -Self::apply_diff(p1 - p2, h)
39 }
40}