#[repr(C)]pub struct Line<const D: usize> { /* private fields */ }Expand description
An n-dimensional line, defined by an origin and a direction
The dimensionality of the line is defined by the const generic D
parameter.
Implementations§
source§impl<const D: usize> Line<D>
impl<const D: usize> Line<D>
sourcepub fn from_origin_and_direction(origin: Point<D>, direction: Vector<D>) -> Self
pub fn from_origin_and_direction(origin: Point<D>, direction: Vector<D>) -> Self
Examples found in repository?
More examples
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
pub fn from_points(
points: [impl Into<Point<D>>; 2],
) -> (Self, [Point<1>; 2]) {
let [a, b] = points.map(Into::into);
let line = Self::from_origin_and_direction(a, b - a);
let coords = [[0.], [1.]].map(Point::from);
(line, coords)
}
/// Create a line from two points that include line coordinates
///
/// # Panics
///
/// Panics, if the points are coincident.
pub fn from_points_with_line_coords(
points: [(impl Into<Point<1>>, impl Into<Point<D>>); 2],
) -> Self {
let [(a_line, a_global), (b_line, b_global)] =
points.map(|(point_line, point_global)| {
(point_line.into(), point_global.into())
});
let direction = (b_global - a_global) / (b_line - a_line).t;
let origin = a_global + direction * -a_line.t;
Self::from_origin_and_direction(origin, direction)
}73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
pub fn project_line(&self, line: &Line<3>) -> Line<2> {
let line_origin_relative_to_plane = line.origin() - self.origin();
let line_origin_in_plane = Point {
coords: Vector::from([
self.u()
.scalar_projection_onto(&line_origin_relative_to_plane),
self.v()
.scalar_projection_onto(&line_origin_relative_to_plane),
]),
};
let line_direction_in_plane = self.project_vector(&line.direction());
Line::from_origin_and_direction(
line_origin_in_plane,
line_direction_in_plane,
)
}sourcepub fn from_points(points: [impl Into<Point<D>>; 2]) -> (Self, [Point<1>; 2])
pub fn from_points(points: [impl Into<Point<D>>; 2]) -> (Self, [Point<1>; 2])
Create a line from two points
Also returns the lines coordinates of the provided points on the new line.
Panics
Panics, if the points are coincident.
sourcepub fn from_points_with_line_coords(
points: [(impl Into<Point<1>>, impl Into<Point<D>>); 2]
) -> Self
pub fn from_points_with_line_coords(
points: [(impl Into<Point<1>>, impl Into<Point<D>>); 2]
) -> Self
Create a line from two points that include line coordinates
Panics
Panics, if the points are coincident.
sourcepub fn origin(&self) -> Point<D>
pub fn origin(&self) -> Point<D>
Access the origin of the line
The origin is a point on the line which, together with the direction
field, defines the line fully. The origin also defines the origin of the
line’s 1-dimensional coordinate system.
Examples found in repository?
More examples
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
pub fn project_line(&self, line: &Line<3>) -> Line<2> {
let line_origin_relative_to_plane = line.origin() - self.origin();
let line_origin_in_plane = Point {
coords: Vector::from([
self.u()
.scalar_projection_onto(&line_origin_relative_to_plane),
self.v()
.scalar_projection_onto(&line_origin_relative_to_plane),
]),
};
let line_direction_in_plane = self.project_vector(&line.direction());
Line::from_origin_and_direction(
line_origin_in_plane,
line_direction_in_plane,
)
}sourcepub fn direction(&self) -> Vector<D>
pub fn direction(&self) -> Vector<D>
Access the direction of the line
The length of this vector defines the unit of the line’s curve
coordinate system. The coordinate 1. is always were the direction
vector points, from origin.
Examples found in repository?
More examples
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
pub fn project_line(&self, line: &Line<3>) -> Line<2> {
let line_origin_relative_to_plane = line.origin() - self.origin();
let line_origin_in_plane = Point {
coords: Vector::from([
self.u()
.scalar_projection_onto(&line_origin_relative_to_plane),
self.v()
.scalar_projection_onto(&line_origin_relative_to_plane),
]),
};
let line_direction_in_plane = self.project_vector(&line.direction());
Line::from_origin_and_direction(
line_origin_in_plane,
line_direction_in_plane,
)
}sourcepub fn is_coincident_with(&self, other: &Self) -> bool
pub fn is_coincident_with(&self, other: &Self) -> bool
Determine if this line is coincident with another line
Implementation Note
This method only returns true, if the lines are precisely coincident.
This will probably not be enough going forward, but it’ll do for now.
sourcepub fn point_to_line_coords(&self, point: impl Into<Point<D>>) -> Point<1>
pub fn point_to_line_coords(&self, point: impl Into<Point<D>>) -> Point<1>
Convert a D-dimensional point to line coordinates
Projects the point onto the line before the conversion. This is done to make this method robust against floating point accuracy issues.
Callers are advised to be careful about the points they pass, as the point not being on the line, intentional or not, will never result in an error.
sourcepub fn vector_to_line_coords(&self, vector: impl Into<Vector<D>>) -> Vector<1>
pub fn vector_to_line_coords(&self, vector: impl Into<Vector<D>>) -> Vector<1>
Convert a D-dimensional vector to line coordinates
sourcepub fn point_from_line_coords(&self, point: impl Into<Point<1>>) -> Point<D>
pub fn point_from_line_coords(&self, point: impl Into<Point<1>>) -> Point<D>
Convert a point in line coordinates into a D-dimensional point
sourcepub fn vector_from_line_coords(&self, vector: impl Into<Vector<1>>) -> Vector<D>
pub fn vector_from_line_coords(&self, vector: impl Into<Vector<1>>) -> Vector<D>
Convert a vector in line coordinates into a D-dimensional vector
Trait Implementations§
source§impl<const D: usize> AbsDiffEq<Line<D>> for Line<D>
impl<const D: usize> AbsDiffEq<Line<D>> for Line<D>
source§fn default_epsilon() -> Self::Epsilon
fn default_epsilon() -> Self::Epsilon
source§fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool
fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool
source§fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
AbsDiffEq::abs_diff_eq.source§impl<const D: usize> Ord for Line<D>
impl<const D: usize> Ord for Line<D>
source§impl<const D: usize> PartialEq<Line<D>> for Line<D>
impl<const D: usize> PartialEq<Line<D>> for Line<D>
source§impl<const D: usize> PartialOrd<Line<D>> for Line<D>
impl<const D: usize> PartialOrd<Line<D>> for Line<D>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self and other) and is used by the <=
operator. Read moreimpl<const D: usize> Copy for Line<D>
impl<const D: usize> Eq for Line<D>
impl<const D: usize> StructuralEq for Line<D>
impl<const D: usize> StructuralPartialEq for Line<D>
Auto Trait Implementations§
impl<const D: usize> RefUnwindSafe for Line<D>
impl<const D: usize> Send for Line<D>
impl<const D: usize> Sync for Line<D>
impl<const D: usize> Unpin for Line<D>
impl<const D: usize> UnwindSafe for Line<D>
Blanket Implementations§
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.