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