gfxmath_vec3/impls/norm/norm.rs
1use crate::Vec3;
2use crate::ops::Norm;
3
4/// ```
5/// use gfxmath_vec3::ops::Norm;
6/// use gfxmath_vec3::Vec3;
7///
8/// let a = Vec3::<f32>::new(3.0, 4.0, 0.0);
9/// let an = a.norm().unwrap();
10///
11/// assert_eq!(3.0/5.0, an.x);
12/// assert_eq!(4.0/5.0, an.y);
13/// assert_eq!(0.0, an.z);
14/// ```
15#[opimps::impl_uni_ops(Norm)]
16#[inline]
17fn norm(self: Vec3<f32>) -> Option<Vec3<f32>> {
18 let l = self.as_slice();
19
20 let len = l[0] * l[0]
21 + l[1] * l[1]
22 + l[2] * l[2];
23
24 let len = len.sqrt();
25 if len == 0.0 { return None; }
26
27 Some(
28 Vec3::new(
29 l[0]/len,
30 l[1]/len,
31 l[2]/len
32 )
33 )
34}
35
36/// ```
37/// use gfxmath_vec3::ops::Norm;
38/// use gfxmath_vec3::Vec3;
39///
40/// let a = Vec3::<f64>::new(3.0, 4.0, 0.0);
41/// let an = a.norm().unwrap();
42///
43/// assert_eq!(3.0/5.0, an.x);
44/// assert_eq!(4.0/5.0, an.y);
45/// assert_eq!(0.0, an.z);
46/// ```
47#[opimps::impl_uni_ops(Norm)]
48fn norm(self: Vec3<f64>) -> Option<Vec3<f64>> {
49 let l = self.as_slice();
50
51 let len = l[0] * l[0]
52 + l[1] * l[1]
53 + l[2] * l[2];
54
55 let len = len.sqrt();
56 if len == 0.0 { return None; }
57
58 Some(
59 Vec3::new(
60 l[0]/len,
61 l[1]/len,
62 l[2]/len
63 )
64 )
65}