use num::{One, Zero}; use alga::general::{SubsetOf, SupersetOf, ClosedDiv}; use core::{DefaultAllocator, Scalar, Matrix, VectorN}; use core::dimension::{DimName, DimNameSum, DimNameAdd, U1}; use core::allocator::Allocator; use geometry::Point; /* * This file provides the following conversions: * ============================================= * * Point -> Point * Point -> Vector (homogeneous) */ impl SubsetOf> for Point where D: DimName, N1: Scalar, N2: Scalar + SupersetOf, DefaultAllocator: Allocator + Allocator { #[inline] fn to_superset(&self) -> Point { Point::from_coordinates(self.coords.to_superset()) } #[inline] fn is_in_subset(m: &Point) -> bool { // FIXME: is there a way to reuse the `.is_in_subset` from the matrix implementation of // SubsetOf? m.iter().all(|e| e.is_in_subset()) } #[inline] unsafe fn from_superset_unchecked(m: &Point) -> Self { Point::from_coordinates(Matrix::from_superset_unchecked(&m.coords)) } } impl SubsetOf>> for Point where D: DimNameAdd, N1: Scalar, N2: Scalar + Zero + One + ClosedDiv + SupersetOf, DefaultAllocator: Allocator + Allocator> + Allocator> + Allocator { #[inline] fn to_superset(&self) -> VectorN> { let p: Point = self.to_superset(); p.to_homogeneous() } #[inline] fn is_in_subset(v: &VectorN>) -> bool { ::is_convertible::<_, VectorN>>(v) && !v[D::dim()].is_zero() } #[inline] unsafe fn from_superset_unchecked(v: &VectorN>) -> Self { let coords = v.fixed_slice::(0, 0) / v[D::dim()]; Self::from_coordinates(::convert_unchecked(coords)) } }