nalgebra_glm/ext/
vector_common.rs

1use crate::aliases::TVec;
2use crate::traits::Number;
3
4/// Component-wise maximum between a vector and a scalar.
5///
6/// # See also:
7///
8/// * [`comp_max()`](crate::comp_max)
9/// * [`comp_min()`](crate::comp_min)
10/// * [`max2()`]
11/// * [`max3()`]
12/// * [`max4()`]
13/// * [`min()`]
14/// * [`min2()`]
15/// * [`min3()`]
16/// * [`min4()`]
17pub fn max<T: Number, const D: usize>(a: &TVec<T, D>, b: T) -> TVec<T, D> {
18    a.map(|a| crate::max2_scalar(a, b))
19}
20
21/// Component-wise maximum between two vectors.
22///
23/// # See also:
24///
25/// * [`comp_max()`](crate::comp_max)
26/// * [`comp_min()`](crate::comp_min)
27/// * [`max()`]
28/// * [`max3()`]
29/// * [`max4()`]
30/// * [`min()`]
31/// * [`min2()`]
32/// * [`min3()`]
33/// * [`min4()`]
34pub fn max2<T: Number, const D: usize>(a: &TVec<T, D>, b: &TVec<T, D>) -> TVec<T, D> {
35    a.zip_map(b, |a, b| crate::max2_scalar(a, b))
36}
37
38/// Component-wise maximum between three vectors.
39///
40/// # See also:
41///
42/// * [`comp_max()`](crate::comp_max)
43/// * [`comp_min()`](crate::comp_min)
44/// * [`max()`]
45/// * [`max2()`]
46/// * [`max4()`]
47/// * [`min()`]
48/// * [`min2()`]
49/// * [`min3()`]
50/// * [`min4()`]
51pub fn max3<T: Number, const D: usize>(
52    a: &TVec<T, D>,
53    b: &TVec<T, D>,
54    c: &TVec<T, D>,
55) -> TVec<T, D> {
56    max2(&max2(a, b), c)
57}
58
59/// Component-wise maximum between four vectors.
60///
61/// # See also:
62///
63/// * [`comp_max()`](crate::comp_max)
64/// * [`comp_min()`](crate::comp_min)
65/// * [`max()`]
66/// * [`max2()`]
67/// * [`max3()`]
68/// * [`min()`]
69/// * [`min2()`]
70/// * [`min3()`]
71/// * [`min4()`]
72pub fn max4<T: Number, const D: usize>(
73    a: &TVec<T, D>,
74    b: &TVec<T, D>,
75    c: &TVec<T, D>,
76    d: &TVec<T, D>,
77) -> TVec<T, D> {
78    max2(&max2(a, b), &max2(c, d))
79}
80
81/// Component-wise minimum between a vector and a scalar.
82///
83/// # See also:
84///
85/// * [`comp_max()`](crate::comp_max)
86/// * [`comp_min()`](crate::comp_min)
87/// * [`max()`]
88/// * [`max2()`]
89/// * [`max3()`]
90/// * [`max4()`]
91/// * [`min2()`]
92/// * [`min3()`]
93/// * [`min4()`]
94pub fn min<T: Number, const D: usize>(x: &TVec<T, D>, y: T) -> TVec<T, D> {
95    x.map(|x| crate::min2_scalar(x, y))
96}
97
98/// Component-wise minimum between two vectors.
99///
100/// # See also:
101///
102/// * [`comp_max()`](crate::comp_max)
103/// * [`comp_min()`](crate::comp_min)
104/// * [`max()`]
105/// * [`max2()`]
106/// * [`max3()`]
107/// * [`max4()`]
108/// * [`min()`]
109/// * [`min3()`]
110/// * [`min4()`]
111pub fn min2<T: Number, const D: usize>(x: &TVec<T, D>, y: &TVec<T, D>) -> TVec<T, D> {
112    x.zip_map(y, |a, b| crate::min2_scalar(a, b))
113}
114
115/// Component-wise minimum between three vectors.
116///
117/// # See also:
118///
119/// * [`comp_max()`](crate::comp_max)
120/// * [`comp_min()`](crate::comp_min)
121/// * [`max()`]
122/// * [`max2()`]
123/// * [`max3()`]
124/// * [`max4()`]
125/// * [`min()`]
126/// * [`min2()`]
127/// * [`min4()`]
128pub fn min3<T: Number, const D: usize>(
129    a: &TVec<T, D>,
130    b: &TVec<T, D>,
131    c: &TVec<T, D>,
132) -> TVec<T, D> {
133    min2(&min2(a, b), c)
134}
135
136/// Component-wise minimum between four vectors.
137///
138/// # See also:
139///
140/// * [`comp_max()`](crate::comp_max)
141/// * [`comp_min()`](crate::comp_min)
142/// * [`max()`]
143/// * [`max2()`]
144/// * [`max3()`]
145/// * [`max4()`]
146/// * [`min()`]
147/// * [`min2()`]
148/// * [`min3()`]
149pub fn min4<T: Number, const D: usize>(
150    a: &TVec<T, D>,
151    b: &TVec<T, D>,
152    c: &TVec<T, D>,
153    d: &TVec<T, D>,
154) -> TVec<T, D> {
155    min2(&min2(a, b), &min2(c, d))
156}