mod euclidean;
pub mod leader_follower;
mod linear;
pub use euclidean::*;
pub use linear::*;
use nalgebra::constraint::{SameNumberOfRows, ShapeConstraint};
use nalgebra::storage::Storage;
use nalgebra::{Const, Dim, SVector, Scalar, SimdRealField, Vector};
use crate::params::FromParams;
use crate::trajectories::{FullTraj, Trajectory};
pub trait CSpace<X, const N: usize>: FromParams + Sized {
type Traj: Trajectory<X, N>;
fn volume(&self) -> X;
fn cost<R1, R2, S1, S2>(
&self,
start: &Vector<X, R1, S1>,
end: &Vector<X, R2, S2>,
) -> X
where
X: SimdRealField,
R1: Dim,
R2: Dim,
S1: Storage<X, R1>,
S2: Storage<X, R2>,
ShapeConstraint: SameNumberOfRows<R1, R2>
+ SameNumberOfRows<R1, Const<N>>
+ SameNumberOfRows<R2, Const<N>>;
fn trajectory<S1, S2>(
&self,
start: Vector<X, Const<N>, S1>,
end: Vector<X, Const<N>, S2>,
) -> Option<FullTraj<X, Self::Traj, S1, S2, N>>
where
X: Scalar,
S1: Storage<X, Const<N>>,
S2: Storage<X, Const<N>>;
fn is_free<S>(&self, state: &Vector<X, Const<N>, S>) -> bool
where
S: Storage<X, Const<N>>;
fn saturate(&self, a: &mut SVector<X, N>, b: &SVector<X, N>, delta: X);
fn sample(&mut self) -> SVector<X, N>;
}