2018-05-19 21:41:58 +08:00
use approx ::{ AbsDiffEq , RelativeEq , UlpsEq } ;
2023-07-08 20:55:16 +08:00
use num ::{ One , Zero } ;
2016-12-05 05:44:42 +08:00
use std ::cmp ::Ordering ;
2018-05-19 21:41:58 +08:00
use std ::fmt ;
use std ::hash ;
2016-12-05 05:44:42 +08:00
2023-07-09 17:36:44 +08:00
#[ cfg(feature = " rkyv-serialize " ) ]
use rkyv ::bytecheck ;
2021-04-12 18:14:16 +08:00
#[ cfg(feature = " serde-serialize-no-std " ) ]
2018-10-22 13:00:10 +08:00
use serde ::{ Deserialize , Deserializer , Serialize , Serializer } ;
2017-05-04 10:02:30 +08:00
2020-03-25 02:06:28 +08:00
use simba ::simd ::SimdPartialOrd ;
2019-03-23 21:29:07 +08:00
use crate ::base ::allocator ::Allocator ;
use crate ::base ::dimension ::{ DimName , DimNameAdd , DimNameSum , U1 } ;
use crate ::base ::iter ::{ MatrixIter , MatrixIterMut } ;
2021-08-03 00:41:46 +08:00
use crate ::base ::{ Const , DefaultAllocator , OVector , Scalar } ;
2023-07-08 20:55:16 +08:00
use simba ::scalar ::{ ClosedAdd , ClosedMul , ClosedSub } ;
2021-08-03 00:41:46 +08:00
use std ::mem ::MaybeUninit ;
2016-12-05 05:44:42 +08:00
2020-11-21 00:45:11 +08:00
/// A point in an euclidean space.
///
2021-07-24 10:22:59 +08:00
/// The difference between a point and a vector is only semantic. See [the user guide](https://www.nalgebra.org/docs/user_guide/points_and_transformations)
2020-11-21 00:45:11 +08:00
/// for details on the distinction. The most notable difference that vectors ignore translations.
/// In particular, an [`Isometry2`](crate::Isometry2) or [`Isometry3`](crate::Isometry3) will
/// transform points by applying a rotation and a translation on them. However, these isometries
/// will only apply rotations to vectors (when doing `isometry * vector`, the translation part of
/// the isometry is ignored).
///
/// # Construction
/// * [From individual components <span style="float:right;">`new`…</span>](#construction-from-individual-components)
/// * [Swizzling <span style="float:right;">`xx`, `yxz`…</span>](#swizzling)
/// * [Other construction methods <span style="float:right;">`origin`, `from_slice`, `from_homogeneous`…</span>](#other-construction-methods)
///
/// # Transformation
/// Transforming a point by an [Isometry](crate::Isometry), [rotation](crate::Rotation), etc. can be
/// achieved by multiplication, e.g., `isometry * point` or `rotation * point`. Some of these transformation
/// may have some other methods, e.g., `isometry.inverse_transform_point(&point)`. See the documentation
/// of said transformations for details.
2021-08-03 00:41:46 +08:00
#[ repr(C) ]
2021-09-13 01:52:46 +08:00
#[ derive(Clone) ]
2022-07-18 04:51:20 +08:00
#[ cfg_attr(feature = " rkyv-serialize " , derive(bytecheck::CheckBytes)) ]
2022-04-30 16:32:10 +08:00
#[ cfg_attr(
feature = " rkyv-serialize-no-std " ,
2022-07-18 04:51:20 +08:00
derive ( rkyv ::Archive , rkyv ::Serialize , rkyv ::Deserialize ) ,
archive (
as = " OPoint<T::Archived, D> " ,
bound ( archive = "
T : rkyv ::Archive ,
T ::Archived : Scalar ,
OVector < T , D > : rkyv ::Archive < Archived = OVector < T ::Archived , D > > ,
DefaultAllocator : Allocator < T ::Archived , D > ,
" )
)
2022-04-30 16:32:10 +08:00
) ]
2021-08-03 00:41:46 +08:00
pub struct OPoint < T : Scalar , D : DimName >
2021-06-27 00:39:02 +08:00
where
2021-08-03 00:41:46 +08:00
DefaultAllocator : Allocator < T , D > ,
2021-06-27 00:39:02 +08:00
{
2017-02-13 01:17:09 +08:00
/// The coordinates of this point, i.e., the shift from the origin.
2021-06-27 00:39:02 +08:00
pub coords : OVector < T , D > ,
2016-12-05 05:44:42 +08:00
}
2021-09-13 01:52:46 +08:00
impl < T : Scalar + fmt ::Debug , D : DimName > fmt ::Debug for OPoint < T , D >
where
DefaultAllocator : Allocator < T , D > ,
{
fn fmt ( & self , formatter : & mut fmt ::Formatter < '_ > ) -> Result < ( ) , fmt ::Error > {
self . coords . as_slice ( ) . fmt ( formatter )
}
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar + hash ::Hash , D : DimName > hash ::Hash for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
{
2017-08-03 01:37:44 +08:00
fn hash < H : hash ::Hasher > ( & self , state : & mut H ) {
self . coords . hash ( state )
}
2016-12-05 05:44:42 +08:00
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar + Copy , D : DimName > Copy for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
OVector < T , D > : Copy ,
{
}
2016-12-05 05:44:42 +08:00
2022-03-17 01:07:29 +08:00
#[ cfg(feature = " cuda " ) ]
unsafe impl < T : Scalar + cust_core ::DeviceCopy , D : DimName > cust_core ::DeviceCopy for OPoint < T , D >
2021-11-23 19:03:11 +08:00
where
DefaultAllocator : Allocator < T , D > ,
2022-03-17 01:07:29 +08:00
OVector < T , D > : cust_core ::DeviceCopy ,
2021-11-23 19:03:11 +08:00
{
}
2021-02-25 21:19:20 +08:00
#[ cfg(feature = " bytemuck " ) ]
2021-08-03 00:41:46 +08:00
unsafe impl < T : Scalar , D : DimName > bytemuck ::Zeroable for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
2021-07-10 17:24:23 +08:00
OVector < T , D > : bytemuck ::Zeroable ,
2021-06-27 00:39:02 +08:00
DefaultAllocator : Allocator < T , D > ,
2021-02-25 21:19:20 +08:00
{
}
#[ cfg(feature = " bytemuck " ) ]
2021-08-03 00:41:46 +08:00
unsafe impl < T : Scalar , D : DimName > bytemuck ::Pod for OPoint < T , D >
2021-02-25 21:19:20 +08:00
where
2021-04-11 17:00:38 +08:00
T : Copy ,
2021-07-10 17:24:23 +08:00
OVector < T , D > : bytemuck ::Pod ,
2021-06-27 00:39:02 +08:00
DefaultAllocator : Allocator < T , D > ,
2021-02-25 21:19:20 +08:00
{
}
2021-04-12 18:14:16 +08:00
#[ cfg(feature = " serde-serialize-no-std " ) ]
2021-08-03 00:41:46 +08:00
impl < T : Scalar , D : DimName > Serialize for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
2021-08-03 00:41:46 +08:00
< DefaultAllocator as Allocator < T , D > > ::Buffer : Serialize ,
2021-06-27 00:39:02 +08:00
{
2017-08-03 01:37:44 +08:00
fn serialize < S > ( & self , serializer : S ) -> Result < S ::Ok , S ::Error >
2020-04-06 00:49:48 +08:00
where
S : Serializer ,
{
2018-02-02 19:26:35 +08:00
self . coords . serialize ( serializer )
}
2017-05-04 10:02:30 +08:00
}
2021-04-12 18:14:16 +08:00
#[ cfg(feature = " serde-serialize-no-std " ) ]
2021-08-03 00:41:46 +08:00
impl < ' a , T : Scalar , D : DimName > Deserialize < ' a > for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
2021-08-03 00:41:46 +08:00
< DefaultAllocator as Allocator < T , D > > ::Buffer : Deserialize < ' a > ,
2021-06-27 00:39:02 +08:00
{
2017-08-03 01:37:44 +08:00
fn deserialize < Des > ( deserializer : Des ) -> Result < Self , Des ::Error >
2020-04-06 00:49:48 +08:00
where
Des : Deserializer < ' a > ,
{
2021-07-02 18:01:01 +08:00
let coords = OVector ::< T , D > ::deserialize ( deserializer ) ? ;
2017-08-03 01:37:44 +08:00
2019-02-17 05:29:41 +08:00
Ok ( Self ::from ( coords ) )
2018-02-02 19:26:35 +08:00
}
2017-05-04 10:02:30 +08:00
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar , D : DimName > OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
{
2020-10-25 18:24:05 +08:00
/// Returns a point containing the result of `f` applied to each of its entries.
///
/// # Example
/// ```
/// # use nalgebra::{Point2, Point3};
/// let p = Point2::new(1.0, 2.0);
/// assert_eq!(p.map(|e| e * 10.0), Point2::new(10.0, 20.0));
///
/// // This works in any dimension.
/// let p = Point3::new(1.1, 2.1, 3.1);
/// assert_eq!(p.map(|e| e as u32), Point3::new(1, 2, 3));
/// ```
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2021-08-03 00:41:46 +08:00
pub fn map < T2 : Scalar , F : FnMut ( T ) -> T2 > ( & self , f : F ) -> OPoint < T2 , D >
2021-07-17 12:17:56 +08:00
where
2021-06-27 00:39:02 +08:00
DefaultAllocator : Allocator < T2 , D > ,
{
2020-10-25 18:24:05 +08:00
self . coords . map ( f ) . into ( )
}
/// Replaces each component of `self` by the result of a closure `f` applied on it.
///
/// # Example
/// ```
/// # use nalgebra::{Point2, Point3};
/// let mut p = Point2::new(1.0, 2.0);
2021-08-03 00:41:46 +08:00
/// p.apply(|e| *e = *e * 10.0);
2020-10-25 18:24:05 +08:00
/// assert_eq!(p, Point2::new(10.0, 20.0));
///
/// // This works in any dimension.
/// let mut p = Point3::new(1.0, 2.0, 3.0);
2021-08-03 00:41:46 +08:00
/// p.apply(|e| *e = *e * 10.0);
2020-10-25 18:24:05 +08:00
/// assert_eq!(p, Point3::new(10.0, 20.0, 30.0));
/// ```
#[ inline ]
2021-08-03 00:41:46 +08:00
pub fn apply < F : FnMut ( & mut T ) > ( & mut self , f : F ) {
2020-10-25 18:24:05 +08:00
self . coords . apply ( f )
}
2017-08-03 01:37:44 +08:00
/// Converts this point into a vector in homogeneous coordinates, i.e., appends a `1` at the
/// end of it.
2018-10-27 17:00:11 +08:00
///
/// This is the same as `.into()`.
///
/// # Example
/// ```
/// # use nalgebra::{Point2, Point3, Vector3, Vector4};
/// let p = Point2::new(10.0, 20.0);
/// assert_eq!(p.to_homogeneous(), Vector3::new(10.0, 20.0, 1.0));
///
/// // This works in any dimension.
/// let p = Point3::new(10.0, 20.0, 30.0);
/// assert_eq!(p.to_homogeneous(), Vector4::new(10.0, 20.0, 30.0, 1.0));
/// ```
2016-12-05 05:44:42 +08:00
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2021-06-27 00:39:02 +08:00
pub fn to_homogeneous ( & self ) -> OVector < T , DimNameSum < D , U1 > >
2018-02-02 19:26:35 +08:00
where
2021-04-11 17:00:38 +08:00
T : One ,
2021-06-27 00:39:02 +08:00
D : DimNameAdd < U1 > ,
DefaultAllocator : Allocator < T , DimNameSum < D , U1 > > ,
2018-02-02 19:26:35 +08:00
{
2021-08-03 00:41:46 +08:00
// TODO: this is mostly a copy-past from Vector::push.
// But we can’ t use Vector::push because of the DimAdd bound
// (which we don’ t use because we use DimNameAdd).
// We should find a way to re-use Vector::push.
let len = self . len ( ) ;
let mut res = crate ::Matrix ::uninit ( DimNameSum ::< D , U1 > ::name ( ) , Const ::< 1 > ) ;
// This is basically a copy_from except that we warp the copied
// values into MaybeUninit.
2022-11-14 21:14:42 +08:00
res . generic_view_mut ( ( 0 , 0 ) , self . coords . shape_generic ( ) )
2021-08-03 00:41:46 +08:00
. zip_apply ( & self . coords , | out , e | * out = MaybeUninit ::new ( e ) ) ;
res [ ( len , 0 ) ] = MaybeUninit ::new ( T ::one ( ) ) ;
// Safety: res has been fully initialized.
unsafe { res . assume_init ( ) }
2016-12-05 05:44:42 +08:00
}
2023-07-08 20:55:16 +08:00
/// Linear interpolation between two points.
///
/// Returns `self * (1.0 - t) + rhs.coords * t`, i.e., the linear blend of the points
/// `self` and `rhs` using the scalar value `t`.
///
/// The value for a is not restricted to the range `[0, 1]`.
///
/// # Examples:
///
/// ```
/// # use nalgebra::Point3;
/// let a = Point3::new(1.0, 2.0, 3.0);
/// let b = Point3::new(10.0, 20.0, 30.0);
/// assert_eq!(a.lerp(&b, 0.1), Point3::new(1.9, 3.8, 5.7));
/// ```
#[ must_use ]
pub fn lerp ( & self , rhs : & OPoint < T , D > , t : T ) -> OPoint < T , D >
where
T : Scalar + Zero + One + ClosedAdd + ClosedSub + ClosedMul ,
{
OPoint {
coords : self . coords . lerp ( & rhs . coords , t ) ,
}
}
2017-08-03 01:37:44 +08:00
/// Creates a new point with the given coordinates.
2018-10-24 02:47:42 +08:00
#[ deprecated(note = " Use Point::from(vector) instead. " ) ]
2016-12-05 05:44:42 +08:00
#[ inline ]
2021-06-27 00:39:02 +08:00
pub fn from_coordinates ( coords : OVector < T , D > ) -> Self {
2020-10-11 16:57:26 +08:00
Self { coords }
2016-12-05 05:44:42 +08:00
}
/// The dimension of this point.
2018-10-27 17:00:11 +08:00
///
/// # Example
/// ```
/// # use nalgebra::{Point2, Point3};
/// let p = Point2::new(1.0, 2.0);
/// assert_eq!(p.len(), 2);
///
/// // This works in any dimension.
/// let p = Point3::new(10.0, 20.0, 30.0);
/// assert_eq!(p.len(), 3);
/// ```
2016-12-05 05:44:42 +08:00
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2016-12-05 05:44:42 +08:00
pub fn len ( & self ) -> usize {
self . coords . len ( )
}
2020-11-19 19:24:26 +08:00
/// Returns true if the point contains no elements.
///
/// # Example
/// ```
/// # use nalgebra::{Point2, Point3};
/// let p = Point2::new(1.0, 2.0);
/// assert!(!p.is_empty());
/// ```
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2020-11-19 19:24:26 +08:00
pub fn is_empty ( & self ) -> bool {
self . len ( ) = = 0
}
2016-12-05 05:44:42 +08:00
/// The stride of this point. This is the number of buffer element separating each component of
/// this point.
#[ inline ]
2018-10-27 17:00:11 +08:00
#[ deprecated(note = " This methods is no longer significant and will always return 1. " ) ]
2016-12-05 05:44:42 +08:00
pub fn stride ( & self ) -> usize {
self . coords . strides ( ) . 0
}
/// Iterates through this point coordinates.
2018-10-27 17:00:11 +08:00
///
/// # Example
/// ```
/// # use nalgebra::Point3;
/// let p = Point3::new(1.0, 2.0, 3.0);
/// let mut it = p.iter().cloned();
///
/// assert_eq!(it.next(), Some(1.0));
/// assert_eq!(it.next(), Some(2.0));
/// assert_eq!(it.next(), Some(3.0));
/// assert_eq!(it.next(), None);
2022-03-23 00:53:46 +08:00
/// ```
2016-12-05 05:44:42 +08:00
#[ inline ]
2021-08-03 00:41:46 +08:00
pub fn iter (
& self ,
) -> MatrixIter < '_ , T , D , Const < 1 > , < DefaultAllocator as Allocator < T , D > > ::Buffer > {
2016-12-05 05:44:42 +08:00
self . coords . iter ( )
}
/// Gets a reference to i-th element of this point without bound-checking.
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2021-04-11 17:00:38 +08:00
pub unsafe fn get_unchecked ( & self , i : usize ) -> & T {
2017-08-03 01:37:44 +08:00
self . coords . vget_unchecked ( i )
2016-12-05 05:44:42 +08:00
}
/// Mutably iterates through this point coordinates.
2018-10-27 17:00:11 +08:00
///
/// # Example
/// ```
/// # use nalgebra::Point3;
/// let mut p = Point3::new(1.0, 2.0, 3.0);
///
/// for e in p.iter_mut() {
/// *e *= 10.0;
/// }
///
/// assert_eq!(p, Point3::new(10.0, 20.0, 30.0));
2022-03-23 00:53:46 +08:00
/// ```
2016-12-05 05:44:42 +08:00
#[ inline ]
2021-08-03 00:41:46 +08:00
pub fn iter_mut (
& mut self ,
) -> MatrixIterMut < '_ , T , D , Const < 1 > , < DefaultAllocator as Allocator < T , D > > ::Buffer > {
2016-12-05 05:44:42 +08:00
self . coords . iter_mut ( )
}
/// Gets a mutable reference to i-th element of this point without bound-checking.
#[ inline ]
2021-06-07 23:10:21 +08:00
#[ must_use ]
2021-04-11 17:00:38 +08:00
pub unsafe fn get_unchecked_mut ( & mut self , i : usize ) -> & mut T {
2017-08-03 01:37:44 +08:00
self . coords . vget_unchecked_mut ( i )
2016-12-05 05:44:42 +08:00
}
/// Swaps two entries without bound-checking.
#[ inline ]
pub unsafe fn swap_unchecked ( & mut self , i1 : usize , i2 : usize ) {
self . coords . swap_unchecked ( ( i1 , 0 ) , ( i2 , 0 ) )
}
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar + AbsDiffEq , D : DimName > AbsDiffEq for OPoint < T , D >
2018-02-02 19:26:35 +08:00
where
2021-08-04 23:34:25 +08:00
T ::Epsilon : Clone ,
2021-06-27 00:39:02 +08:00
DefaultAllocator : Allocator < T , D > ,
2018-02-02 19:26:35 +08:00
{
2021-04-11 17:00:38 +08:00
type Epsilon = T ::Epsilon ;
2016-12-05 05:44:42 +08:00
#[ inline ]
fn default_epsilon ( ) -> Self ::Epsilon {
2021-04-11 17:00:38 +08:00
T ::default_epsilon ( )
2016-12-05 05:44:42 +08:00
}
#[ inline ]
2018-05-19 21:41:58 +08:00
fn abs_diff_eq ( & self , other : & Self , epsilon : Self ::Epsilon ) -> bool {
self . coords . abs_diff_eq ( & other . coords , epsilon )
2016-12-05 05:44:42 +08:00
}
2018-05-19 21:41:58 +08:00
}
2016-12-05 05:44:42 +08:00
2021-08-03 00:41:46 +08:00
impl < T : Scalar + RelativeEq , D : DimName > RelativeEq for OPoint < T , D >
2018-05-19 21:41:58 +08:00
where
2021-08-04 23:34:25 +08:00
T ::Epsilon : Clone ,
2021-06-27 00:39:02 +08:00
DefaultAllocator : Allocator < T , D > ,
2018-05-19 21:41:58 +08:00
{
2016-12-05 05:44:42 +08:00
#[ inline ]
2018-05-19 21:41:58 +08:00
fn default_max_relative ( ) -> Self ::Epsilon {
2021-04-11 17:00:38 +08:00
T ::default_max_relative ( )
2016-12-05 05:44:42 +08:00
}
#[ inline ]
2018-02-02 19:26:35 +08:00
fn relative_eq (
& self ,
other : & Self ,
epsilon : Self ::Epsilon ,
max_relative : Self ::Epsilon ,
2020-04-06 00:49:48 +08:00
) -> bool {
2018-02-02 19:26:35 +08:00
self . coords
. relative_eq ( & other . coords , epsilon , max_relative )
2016-12-05 05:44:42 +08:00
}
2018-05-19 21:41:58 +08:00
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar + UlpsEq , D : DimName > UlpsEq for OPoint < T , D >
2018-05-19 21:41:58 +08:00
where
2021-08-04 23:34:25 +08:00
T ::Epsilon : Clone ,
2021-06-27 00:39:02 +08:00
DefaultAllocator : Allocator < T , D > ,
2018-05-19 21:41:58 +08:00
{
#[ inline ]
fn default_max_ulps ( ) -> u32 {
2021-04-11 17:00:38 +08:00
T ::default_max_ulps ( )
2018-05-19 21:41:58 +08:00
}
2016-12-05 05:44:42 +08:00
#[ inline ]
fn ulps_eq ( & self , other : & Self , epsilon : Self ::Epsilon , max_ulps : u32 ) -> bool {
self . coords . ulps_eq ( & other . coords , epsilon , max_ulps )
}
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar + Eq , D : DimName > Eq for OPoint < T , D > where DefaultAllocator : Allocator < T , D > { }
2016-12-05 05:44:42 +08:00
2021-08-03 00:41:46 +08:00
impl < T : Scalar , D : DimName > PartialEq for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
{
2016-12-05 05:44:42 +08:00
#[ inline ]
fn eq ( & self , right : & Self ) -> bool {
self . coords = = right . coords
}
}
2021-08-03 00:41:46 +08:00
impl < T : Scalar + PartialOrd , D : DimName > PartialOrd for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
{
2016-12-05 05:44:42 +08:00
#[ inline ]
fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
self . coords . partial_cmp ( & other . coords )
}
#[ inline ]
fn lt ( & self , right : & Self ) -> bool {
self . coords . lt ( & right . coords )
}
#[ inline ]
fn le ( & self , right : & Self ) -> bool {
self . coords . le ( & right . coords )
}
#[ inline ]
fn gt ( & self , right : & Self ) -> bool {
self . coords . gt ( & right . coords )
}
#[ inline ]
fn ge ( & self , right : & Self ) -> bool {
self . coords . ge ( & right . coords )
}
}
2020-03-25 02:06:28 +08:00
/*
* inf / sup
* /
2021-07-17 12:17:56 +08:00
impl < T : Scalar + SimdPartialOrd , D : DimName > OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
{
2020-03-25 02:06:28 +08:00
/// Computes the infimum (aka. componentwise min) of two points.
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2021-06-27 00:39:02 +08:00
pub fn inf ( & self , other : & Self ) -> OPoint < T , D > {
2020-03-25 02:06:28 +08:00
self . coords . inf ( & other . coords ) . into ( )
}
/// Computes the supremum (aka. componentwise max) of two points.
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2021-06-27 00:39:02 +08:00
pub fn sup ( & self , other : & Self ) -> OPoint < T , D > {
2020-03-25 02:06:28 +08:00
self . coords . sup ( & other . coords ) . into ( )
}
/// Computes the (infimum, supremum) of two points.
#[ inline ]
2021-06-07 22:34:03 +08:00
#[ must_use ]
2021-06-27 00:39:02 +08:00
pub fn inf_sup ( & self , other : & Self ) -> ( OPoint < T , D > , OPoint < T , D > ) {
2020-03-25 02:06:28 +08:00
let ( inf , sup ) = self . coords . inf_sup ( & other . coords ) ;
( inf . into ( ) , sup . into ( ) )
}
}
2016-12-05 05:44:42 +08:00
/*
*
* Display
*
* /
2021-08-03 00:41:46 +08:00
impl < T : Scalar + fmt ::Display , D : DimName > fmt ::Display for OPoint < T , D >
2021-06-27 00:39:02 +08:00
where
DefaultAllocator : Allocator < T , D > ,
{
2021-07-26 01:06:14 +08:00
fn fmt ( & self , f : & mut fmt ::Formatter < '_ > ) -> fmt ::Result {
2019-03-23 21:29:07 +08:00
write! ( f , " {{ " ) ? ;
2016-12-05 05:44:42 +08:00
let mut it = self . coords . iter ( ) ;
2019-03-23 21:29:07 +08:00
write! ( f , " {} " , * it . next ( ) . unwrap ( ) ) ? ;
2016-12-05 05:44:42 +08:00
for comp in it {
2019-03-23 21:29:07 +08:00
write! ( f , " , {} " , * comp ) ? ;
2016-12-05 05:44:42 +08:00
}
write! ( f , " }} " )
}
}