del-geo 0.1.26

2D/3D geometry utility codes
Documentation
//! methods for 2D or 3D edge (line segment)

use num_traits::AsPrimitive;

pub fn length_<T, const N: usize>(p0: &[T], p1: &[T]) -> T
where
    T: num_traits::Float + std::ops::AddAssign,
{
    let mut x = T::zero();
    for i in 0..N {
        x += (p0[i] - p1[i]) * (p0[i] - p1[i]);
    }
    x.sqrt()
}

// ---------------------------------------------------

pub fn nearest_to_origin<T, const X: usize>(
    p0: &nalgebra::base::SVector<T, X>, // start
    p1: &nalgebra::base::SVector<T, X>,
) -> nalgebra::base::SVector<T, X>
where
    T: nalgebra::RealField + 'static + Copy,
    f64: num_traits::AsPrimitive<T>,
{
    let d = p1 - p0;
    let a: T = d.dot(&d);
    if a < 1.0e-20_f64.as_() {
        return (p0 + p1) * 0.5_f64.as_();
    }
    let b = d.dot(p0);
    let mut r0: T = -b / a;
    if r0 < T::zero() {
        r0 = T::zero();
    }
    if r0 > T::one() {
        r0 = T::one();
    }
    p0.scale(T::one() - r0) + p1.scale(r0)
}

pub fn distance_to_point<T, const X: usize>(
    po_c: &nalgebra::base::SVector<T, X>,
    po_s: &nalgebra::base::SVector<T, X>,
    po_e: &nalgebra::base::SVector<T, X>,
) -> T
where
    T: nalgebra::RealField + 'static + Copy,
    f64: num_traits::AsPrimitive<T>,
{
    crate::edge::nearest_to_origin(&(po_s - po_c), &(po_e - po_c)).norm()
}