use alga::general::{Field, JoinSemilattice, Lattice, MeetSemilattice, RealField}; use alga::linear::{AffineSpace, EuclideanSpace}; use crate::base::allocator::Allocator; use crate::base::dimension::DimName; use crate::base::{DefaultAllocator, Scalar, VectorN}; use crate::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 RealField = 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(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 { Self::from(self.coords.meet(&other.coords)) } } impl JoinSemilattice for Point where N: Scalar + JoinSemilattice, DefaultAllocator: Allocator, { #[inline] fn join(&self, other: &Self) -> Self { Self::from(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); (Self::from(meet), Self::from(join)) } }