nalgebra_glm/gtx/
vector_query.rs

1use crate::RealNumber;
2
3use crate::aliases::{TVec, TVec2, TVec3};
4use crate::traits::Number;
5
6/// Returns `true` if two vectors are collinear (up to an epsilon).
7///
8/// # See also:
9///
10/// * [`are_collinear2d()`]
11pub fn are_collinear<T: Number>(v0: &TVec3<T>, v1: &TVec3<T>, epsilon: T) -> bool {
12    abs_diff_eq!(v0.cross(v1), TVec3::<T>::zeros(), epsilon = epsilon)
13}
14
15/// Returns `true` if two 2D vectors are collinear (up to an epsilon).
16///
17/// # See also:
18///
19/// * [`are_collinear()`]
20pub fn are_collinear2d<T: Number>(v0: &TVec2<T>, v1: &TVec2<T>, epsilon: T) -> bool {
21    abs_diff_eq!(v0.perp(v1), T::zero(), epsilon = epsilon)
22}
23
24/// Returns `true` if two vectors are orthogonal (up to an epsilon).
25pub fn are_orthogonal<T: Number, const D: usize>(
26    v0: &TVec<T, D>,
27    v1: &TVec<T, D>,
28    epsilon: T,
29) -> bool {
30    abs_diff_eq!(v0.dot(v1), T::zero(), epsilon = epsilon)
31}
32
33//pub fn are_orthonormal<T: Number, const D: usize>(v0: &TVec<T, D>, v1: &TVec<T, D>, epsilon: T) -> bool {
34//    unimplemented!()
35//}
36
37/// Returns `true` if all the components of `v` are zero (up to an epsilon).
38pub fn is_comp_null<T: Number, const D: usize>(v: &TVec<T, D>, epsilon: T) -> TVec<bool, D> {
39    v.map(|x| abs_diff_eq!(x, T::zero(), epsilon = epsilon))
40}
41
42/// Returns `true` if `v` has a magnitude of 1 (up to an epsilon).
43pub fn is_normalized<T: RealNumber, const D: usize>(v: &TVec<T, D>, epsilon: T) -> bool {
44    // sqrt(1 + epsilon_{norm²} = 1 + epsilon_{norm}
45    // ==> epsilon_{norm²} = epsilon_{norm}² + 2*epsilon_{norm}
46    // For small epsilon, epsilon² is basically zero, so use 2*epsilon.
47    abs_diff_eq!(v.norm_squared(), T::one(), epsilon = epsilon + epsilon)
48}
49
50/// Returns `true` if `v` is zero (up to an epsilon).
51pub fn is_null<T: RealNumber, const D: usize>(v: &TVec<T, D>, epsilon: T) -> bool {
52    abs_diff_eq!(v.norm_squared(), T::zero(), epsilon = epsilon * epsilon)
53}