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}