use crate::op::{Additive, Multiplicative};
use super::{Field, Group, Magma, Module, NormedSpace, VectorSpace};
pub trait EuclideanSpace: Sized + Clone + PartialEq
where
<Self::Coordinates as Module<Additive, Multiplicative>>::Scalar:
Field<Additive, Multiplicative>,
{
type Coordinates: NormedSpace<Additive, Multiplicative>
+ Module<Additive, Multiplicative>
+ VectorSpace<Additive, Multiplicative>
+ Clone;
fn origin() -> Self;
fn from_coordinates(coords: Self::Coordinates) -> Self;
fn coordinates(&self) -> Self::Coordinates;
fn distance(
&self, other: &Self,
) -> <Self::Coordinates as NormedSpace<Additive, Multiplicative>>::RealField {
let diff = <Self::Coordinates as Magma<Additive>>::combine(
&self.coordinates(),
&<Self::Coordinates as Group<Additive>>::inverse(&other.coordinates()),
);
diff.norm()
}
}
pub trait AffineSpace: Sized + Clone + PartialEq
where
<Self::Translation as Module<Additive, Multiplicative>>::Scalar:
Field<Additive, Multiplicative>,
{
type Translation: VectorSpace<Additive, Multiplicative>;
fn origin() -> Self;
fn from_point_translation(origin: &Self, translation: &Self::Translation) -> Self;
fn translate_by(&self, t: &Self::Translation) -> Self;
fn translation(&self, other: &Self) -> Self::Translation;
}