Trait cgmath::prelude::EuclideanSpace [−][src]
pub trait EuclideanSpace: Copy + Clone where
Self: Array<Element = Self::Scalar>,
Self: Add<Self::Diff, Output = Self>,
Self: Sub<Self::Diff, Output = Self>,
Self: Sub<Self, Output = Self::Diff>,
Self: Mul<Self::Scalar, Output = Self>,
Self: Div<Self::Scalar, Output = Self>,
Self: Rem<Self::Scalar, Output = Self>, {
type Scalar: BaseNum;
type Diff: VectorSpace<Scalar = Self::Scalar>;
fn origin() -> Self;
fn from_vec(v: Self::Diff) -> Self;
fn to_vec(self) -> Self::Diff;
fn dot(self, v: Self::Diff) -> Self::Scalar;
fn midpoint(self, other: Self) -> Self { ... }
fn centroid(points: &[Self]) -> Self { ... }
}
Expand description
Points in a Euclidean space with an associated space of displacement vectors.
Point-Vector distinction
cgmath
distinguishes between points and vectors in the following way:
- Points are locations relative to an origin
- Vectors are displacements between those points
For example, to find the midpoint between two points, you can write the following:
use cgmath::Point3;
let p0 = Point3::new(1.0, 2.0, 3.0);
let p1 = Point3::new(-3.0, 1.0, 2.0);
let midpoint: Point3<f32> = p0 + (p1 - p0) * 0.5;
Breaking the expression up, and adding explicit types makes it clearer to see what is going on:
let dv: Vector3<f32> = p1 - p0;
let half_dv: Vector3<f32> = dv * 0.5;
let midpoint: Point3<f32> = p0 + half_dv;
Converting between points and vectors
Points can be converted to and from displacement vectors using the
EuclideanSpace::{from_vec, to_vec}
methods. Note that under the hood these
are implemented as inlined a type conversion, so should not have any
performance implications.
References
Associated Types
The associated scalar over which the space is defined.
Due to the equality constraints demanded by Self::Diff
, this is effectively just an
alias to Self::Diff::Scalar
.
type Diff: VectorSpace<Scalar = Self::Scalar>
type Diff: VectorSpace<Scalar = Self::Scalar>
The associated space of displacement vectors.
Required methods
Convert a displacement vector to a point.
This can be considered equivalent to the addition of the displacement
vector v
to to Self::origin()
.
Convert a point to a displacement vector.
This can be seen as equivalent to the displacement vector from
Self::origin()
to self
.
Provided methods
Returns the middle point between two other points.
use cgmath::prelude::*;
use cgmath::Point3;
let p = Point3::midpoint(
Point3::new(1.0, 2.0, 3.0),
Point3::new(3.0, 1.0, 2.0),
);