use nalgebra as na;
pub trait IntoPosition {
fn position(&self) -> na::Vector3<f64>;
}
impl IntoPosition for na::Vector3<f64> {
fn position(&self) -> na::Vector3<f64> {
*self
}
}
impl IntoPosition for na::SVector<f64, 6> {
fn position(&self) -> na::Vector3<f64> {
self.fixed_rows::<3>(0).into()
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn test_into_position_vector3() {
let r = na::Vector3::new(1.0, 2.0, 3.0);
let pos = r.position();
assert_eq!(pos, na::Vector3::new(1.0, 2.0, 3.0));
}
#[test]
fn test_into_position_vector6() {
let x = na::SVector::<f64, 6>::new(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
let pos = x.position();
assert_eq!(pos, na::Vector3::new(1.0, 2.0, 3.0));
}
#[test]
fn test_into_position_generic_function() {
fn get_norm<P: IntoPosition>(r: P) -> f64 {
r.position().norm()
}
let r3 = na::Vector3::new(3.0, 4.0, 0.0);
assert!((get_norm(r3) - 5.0).abs() < 1e-10);
let r6 = na::SVector::<f64, 6>::new(3.0, 4.0, 0.0, 10.0, 20.0, 30.0);
assert!((get_norm(r6) - 5.0).abs() < 1e-10);
}
}