2021-04-11 17:00:38 +08:00
|
|
|
use na::RealField;
|
2018-09-21 01:54:12 +08:00
|
|
|
|
2019-03-23 21:29:07 +08:00
|
|
|
use crate::aliases::{TVec, TVec2, TVec3};
|
2021-04-11 17:00:38 +08:00
|
|
|
use crate::traits::Number;
|
2018-09-21 01:54:12 +08:00
|
|
|
|
2018-09-22 19:18:59 +08:00
|
|
|
/// Returns `true` if two vectors are collinear (up to an epsilon).
|
2018-10-08 10:30:16 +08:00
|
|
|
///
|
|
|
|
/// # See also:
|
|
|
|
///
|
|
|
|
/// * [`are_collinear2d`](fn.are_collinear2d.html)
|
2021-04-11 17:00:38 +08:00
|
|
|
pub fn are_collinear<T: Number>(v0: &TVec3<T>, v1: &TVec3<T>, epsilon: T) -> bool {
|
2018-09-21 01:54:12 +08:00
|
|
|
is_null(&v0.cross(v1), epsilon)
|
|
|
|
}
|
|
|
|
|
2018-09-22 19:18:59 +08:00
|
|
|
/// Returns `true` if two 2D vectors are collinear (up to an epsilon).
|
2018-10-08 10:30:16 +08:00
|
|
|
///
|
|
|
|
/// # See also:
|
|
|
|
///
|
|
|
|
/// * [`are_collinear`](fn.are_collinear.html)
|
2021-04-11 17:00:38 +08:00
|
|
|
pub fn are_collinear2d<T: Number>(v0: &TVec2<T>, v1: &TVec2<T>, epsilon: T) -> bool {
|
|
|
|
abs_diff_eq!(v0.perp(v1), T::zero(), epsilon = epsilon)
|
2018-09-21 01:54:12 +08:00
|
|
|
}
|
|
|
|
|
2018-09-22 19:18:59 +08:00
|
|
|
/// Returns `true` if two vectors are orthogonal (up to an epsilon).
|
2021-04-11 17:00:38 +08:00
|
|
|
pub fn are_orthogonal<T: Number, const D: usize>(
|
|
|
|
v0: &TVec<T, D>,
|
|
|
|
v1: &TVec<T, D>,
|
|
|
|
epsilon: T,
|
|
|
|
) -> bool {
|
|
|
|
abs_diff_eq!(v0.dot(v1), T::zero(), epsilon = epsilon)
|
2018-09-21 01:54:12 +08:00
|
|
|
}
|
|
|
|
|
2021-04-11 17:00:38 +08:00
|
|
|
//pub fn are_orthonormal<T: Number, const D: usize>(v0: &TVec<T, D>, v1: &TVec<T, D>, epsilon: T) -> bool {
|
2018-09-22 19:18:59 +08:00
|
|
|
// unimplemented!()
|
|
|
|
//}
|
2018-09-21 01:54:12 +08:00
|
|
|
|
2018-09-22 19:18:59 +08:00
|
|
|
/// Returns `true` if all the components of `v` are zero (up to an epsilon).
|
2021-04-11 17:00:38 +08:00
|
|
|
pub fn is_comp_null<T: Number, const D: usize>(v: &TVec<T, D>, epsilon: T) -> TVec<bool, D> {
|
|
|
|
v.map(|x| abs_diff_eq!(x, T::zero(), epsilon = epsilon))
|
2018-09-21 01:54:12 +08:00
|
|
|
}
|
|
|
|
|
2018-09-22 19:18:59 +08:00
|
|
|
/// Returns `true` if `v` has a magnitude of 1 (up to an epsilon).
|
2021-04-11 17:00:38 +08:00
|
|
|
pub fn is_normalized<T: RealField, const D: usize>(v: &TVec<T, D>, epsilon: T) -> bool {
|
|
|
|
abs_diff_eq!(v.norm_squared(), T::one(), epsilon = epsilon * epsilon)
|
2018-09-21 01:54:12 +08:00
|
|
|
}
|
|
|
|
|
2018-09-22 19:18:59 +08:00
|
|
|
/// Returns `true` if `v` is zero (up to an epsilon).
|
2021-04-11 17:00:38 +08:00
|
|
|
pub fn is_null<T: Number, const D: usize>(v: &TVec<T, D>, epsilon: T) -> bool {
|
|
|
|
abs_diff_eq!(*v, TVec::<T, D>::zeros(), epsilon = epsilon)
|
2018-09-21 01:54:12 +08:00
|
|
|
}
|