Skip to main content

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}