use alga::general::{Field, Real, MeetSemilattice, JoinSemilattice, Lattice}; use alga::linear::{AffineSpace, EuclideanSpace}; use core::{DefaultAllocator, Scalar, VectorN}; use core::dimension::DimName; use core::allocator::Allocator; use geometry::Point; impl AffineSpace for Point where N: Scalar + Field, DefaultAllocator: Allocator { type Translation = VectorN; } impl EuclideanSpace for Point where DefaultAllocator: Allocator { type Coordinates = VectorN; type Real = N; #[inline] fn origin() -> Self { Self::origin() } #[inline] fn coordinates(&self) -> Self::Coordinates { self.coords.clone() } #[inline] fn from_coordinates(coords: Self::Coordinates) -> Self { Self::from_coordinates(coords) } #[inline] fn scale_by(&self, n: N) -> Self { self * n } } /* * * Ordering * */ impl MeetSemilattice for Point where N: Scalar + MeetSemilattice, DefaultAllocator: Allocator { #[inline] fn meet(&self, other: &Self) -> Self { Point::from_coordinates(self.coords.meet(&other.coords)) } } impl JoinSemilattice for Point where N: Scalar + JoinSemilattice, DefaultAllocator: Allocator { #[inline] fn join(&self, other: &Self) -> Self { Point::from_coordinates(self.coords.join(&other.coords)) } } impl Lattice for Point where N: Scalar + Lattice, DefaultAllocator: Allocator { #[inline] fn meet_join(&self, other: &Self) -> (Self, Self) { let (meet, join) = self.coords.meet_join(&other.coords); (Point::from_coordinates(meet), Point::from_coordinates(join)) } }